leetcode 155.最小栈(min stack)C语言
1.description
https://leetcode-cn.com/problems/min-stack/description/
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
示例:
输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
2.solution
typedef struct min_stack{
int data;
struct min_stack *next;
int min_num;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack *stack = NULL;
stack = (MinStack*)malloc(sizeof(MinStack));
if(stack == NULL){
return NULL;
}
stack->next = NULL;
stack->min_num = INT_MAX;
return stack;
}
void minStackPush(MinStack* obj, int x) {
MinStack *p = NULL;
p = (MinStack*)malloc(sizeof(MinStack));
if(p == NULL){
return;
}
p->data = x;
if(x < obj->min_num){
p->min_num = x;
obj->min_num = x;
}else{
p->min_num = obj->min_num;
}
p->next = obj->next;
obj->next = p;
}
void minStackPop(MinStack* obj) {
// 删除最小值,要更新全局最小值(obj->min_num)
if(obj->next->next && obj->next->data == obj->min_num){
obj->min_num = obj->next->next->min_num;
}
obj->next = obj->next->next;
// 删除完最后一个结点,将obj->min_num重置
if(!obj->next){
obj->min_num = INT_MAX;
}
}
int minStackTop(MinStack* obj) {
return obj->next->data;
}
int minStackGetMin(MinStack* obj) {
return obj->next->min_num;
}
void minStackFree(MinStack* obj) {
if(!obj->next){
return;
}
while(obj->next){
MinStack *p = obj->next;
obj->next = obj->next->next;
free(p);
}
free(obj);
}