题目:
剑指 Offer 30. 包含min函数的栈 - 力扣(LeetCode) (leetcode-cn.com)
思路:
利用一个辅助栈实时更新主栈中的最小值,主栈中的最小值存入辅助栈的栈顶,当入栈的元素比辅助栈顶元素小时,这个数同时入主栈与辅助栈,当出栈的元素与辅助栈栈顶元素相等时,辅助栈栈顶元素也同时出栈,以此达到实时更新主栈中的最小值。
代码:
typedef struct {
int top;
int* stack;
int top_min;
int* stack_min;
} MinStack;
/*
初始化函数(分配空间,给定栈顶)
*/
MinStack* minStackCreate() {
MinStack* min=(MinStack*)malloc(sizeof(MinStack));
min->stack= (int*)malloc(sizeof(int)*10000);
min->stack_min= (int*)malloc(sizeof(int)*10000);
min->top= -1;
min->top_min=-1;
return min;
}
//入栈
void minStackPush(MinStack* obj, int x) {
obj->stack[++(obj->top)]=x;//数据入主栈
//最小值入辅助栈
if(obj->top_min==-1){
obj->stack_min[++obj->top_min]=x;
}else if(obj->stack_min[obj->top_min]>=x){
obj->stack_min[++obj->top_min]=x;
}
}
//出栈
void minStackPop(MinStack* obj) {
//实时更新最小值
if(obj->stack[obj->top]==obj->stack_min[obj->top_min]){
obj->top--;
obj->top_min--;
}else{
obj->top--;
}
}
//返回栈顶数值
int minStackTop(MinStack* obj) {
return obj->stack[obj->top];
}
//返回栈的最小值
int minStackMin(MinStack* obj) {
return obj->stack_min[obj->top_min];
}
void minStackFree(MinStack* obj) {
free(obj->stack);
free(obj->stack_min);
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);
*/