https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/
题目没啥特别的,但由于min、push、pop函数的时间复杂度都要求是O(1),所以求最小值不能用遍历的方法,必须在每次入栈的时候记录当前最小值。因此考虑用辅助栈,每次元素入栈,也同时把当前最小元素入辅助栈,保证辅助栈的栈顶一定是最小值就行。
typedef struct {
int* a;
int* b; //辅助栈
int stackSize; //栈中元素个数
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack* stack=(MinStack*)malloc(sizeof(MinStack));
stack->a=(int*)malloc(sizeof(int)*20000);
stack->b=(int*)malloc(sizeof(int)*20000);
stack->stackSize=0;
return stack;
}
//入栈
void minStackPush(MinStack* obj, int x) {
obj->a[obj->stackSize]=x;
if(obj->stackSize==0){
obj->b[obj->stackSize]=x;
}else{
if(x<obj->b[obj->stackSize-1]) obj->b[obj->stackSize]=x;
else obj->b[obj->stackSize]=obj->b[obj->stackSize-1];
}
obj->stackSize++;
}
//出栈
void minStackPop(MinStack* obj) {
obj->stackSize--;
}
int minStackTop(MinStack* obj) {
return obj->a[obj->stackSize-1];
}
int minStackMin(MinStack* obj) {
return obj->b[obj->stackSize-1];
}
void minStackFree(MinStack* obj) {
free(obj);
}
/**
* Your MinStack struct will be instantiated and called as such:
* MinStack* obj = minStackCreate();
* minStackPush(obj, x);
* minStackPop(obj);
* int param_3 = minStackTop(obj);
* int param_4 = minStackMin(obj);
* minStackFree(obj);
*/