解题思路:
每次入栈两个元素,一个为将要入栈的value元素,一个位min最小元素。
第一次入栈时,将该元素设为min值,入栈两次该元素。此后,每次入栈value都需和min值比较,若比min值小,则min数据更新为该值。若大于min,则min不变。
此后,先入栈value元素,后入栈min。这样就保证了栈顶元素始终为最小值min。
下面上代码:
#include"minStack.h" void minStackInit(minStack* stack) { if(stack == NULL) { //非法输入 return; } stack->size = 0; stack->capacity = 1000; stack->data = (minStackType*)malloc(stack->capacity * sizeof(minStackType)); } void minStackDestroy(minStack* stack) { if(stack == NULL) { //非法输入 return; } free(stack->data); stack->size = 0; stack->capacity = 0; return; } void minStackPrint(minStack* stack,char* msg) { printf("[%s]\n",msg); if(stack == NULL) { //非法输入 return; } if(stack->size == 0) { //空栈 return; } int i = 0; for(;i < stack->size;i++) { printf("%c ",stack->data[i]); } printf("\n"); } void minStackPush(minStack* stack,minStackType value) { if(stack == NULL) { //非法输入 return; } if(stack->size >= stack->capacity) { //栈已满 return; } //假设要插入的值就是最小值 minStackType min = value; if(stack->size == 0) { stack->data[stack->size++] = value; stack->data[stack->size++] = min; return; } if(stack->data[stack->size] < min) { //如果栈顶元素小于min,则让min的值为栈顶元素 min = stack->data[stack->size - 1]; } //先入栈value,再入栈min,确保min在栈顶 stack->data[stack->size++] = value; stack->data[stack->size++] = min; } void minStackPop(minStack* stack) { if(stack == NULL) { //非法输入 return; } if(stack->size == 0) { //空栈 return; } stack->size -= 2; return; } int minStackGet(minStack* stack,minStackType* value) { if(stack == NULL) { //非法输入 return 0; } if(stack->size == 0) { //空栈 return 0; } *value = stack->data[stack->size-1]; return 1; } //////////////////////////////////////////////////// // 以下为测试函数 // //////////////////////////////////////////////////// void TestminStackPush() { TITLE; minStack stack; minStackInit(&stack); minStackPush(&stack,'a'); minStackPrint(&stack,"入栈一个元素"); minStackPush(&stack,'c'); minStackPush(&stack,'d'); minStackPrint(&stack,"再入栈两个元素"); } void TestminStackPop() { TITLE; minStack stack; minStackInit(&stack); minStackPush(&stack,'a'); minStackPush(&stack,'c'); minStackPush(&stack,'d'); minStackPrint(&stack,"入栈三个元素"); minStackPop(&stack); minStackPrint(&stack,"出栈一个元素"); } void TestminStackGet() { TITLE; minStack stack; minStackType value; minStackInit(&stack); minStackPush(&stack,'a'); minStackPush(&stack,'c'); minStackPush(&stack,'d'); minStackPrint(&stack,"入栈三个元素"); int ret = minStackGet(&stack,&value); printf("[取栈最小值]\n"); printf("expect is 1,actul is %d\n",ret); printf("expect is a,actul is %c\n",value); } int main() { TestminStackPush(); TestminStackPop(); TestminStackGet(); return; }
#pragma once #include<stdio.h> #include<stdlib.h> #define TITLE printf("\n=====================%s======================\n",__FUNCTION__); typedef char minStackType; typedef struct minStack { minStackType* data; int size; int capacity; }minStack; void minStackInit(minStack* stack); //初始化 void minStackDestroy(minStack* stack); // 销毁 void minStackPrint(minStack* stack,char* msg); //打印栈 void minStackPush(minStack* stack,minStackType value);//入栈 void minStackPop(minStack* stack);//出栈 int minStackGet(minStack* stack,minStackType* value);//取栈顶元素,失败返回0,成功返回1
运行结果演示:
如图可见栈顶元素始终未最小值 a 。