剑指offer_30 包含min的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.min();   --> 返回 -2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bao-han-minhan-shu-de-zhan-lcof
思路:
举例让抽象问题具体化!!!
1.minStackPush 压入数据
- 第一次压入,记得把最小值也设置为压入值
- 将压入值与最小值比较,如果压入值更小,则最小值设置为压入值,也将辅助栈的栈顶设置为最小值
- 每次压入,将数据栈的新顶为压入值
2.minStackPop弹出数据
数据栈以及辅助栈都减少一个,更新最小值
1 #define maxSize 10000 2 typedef struct { 3 int* x_stack; 4 int* min_stack; 5 int x_top; 6 int min_top; 7 int min_value; 8 } MinStack; 9 10 /** initialize your data structure here. */ 11 12 MinStack* minStackCreate() { 13 MinStack* obj = (MinStack*)malloc(sizeof(MinStack)); 14 obj->x_stack = (int*)malloc(sizeof(int)*maxSize); 15 obj->min_stack = (int*)malloc(sizeof(int)*maxSize); 16 obj->x_top = obj->min_top = -1; 17 obj->min_value = 0; 18 return obj; 19 } 20 // 初始化minStack的内容,里面包括两个栈,一个数据栈,一个辅助栈,同时保存了最小值 21 22 void minStackPush(MinStack* obj, int x) { 23 if(obj->x_top < maxSize) 24 { 25 if(obj->x_top == -1) 26 obj->min_value = x; 27 obj->x_stack[++(obj->x_top)] = x; 28 if(x < obj->min_value) 29 obj->min_value = x; 30 obj->min_stack[++(obj->min_top)] = obj->min_value; 31 } 32 } 33 void minStackPop(MinStack* obj) { 34 (obj->x_top)--; 35 (obj->min_top)--; 36 if(obj->min_top != -1) 37 obj->min_value = obj->min_stack[obj->min_top]; 38 } 39 40 int minStackTop(MinStack* obj) { 41 return obj->x_stack[obj->x_top]; 42 } 43 44 int minStackMin(MinStack* obj) { 45 return obj->min_stack[obj->min_top]; 46 } 47 48 void minStackFree(MinStack* obj) { 49 free(obj->x_stack); 50 free(obj->min_stack); 51 free(obj); 52 }
 
                    
                     
                    
                 
                    
                 
 
                
            
        