【
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) -- 将元素 x 推入栈中。
pop() -- 删除栈顶的元素。
top() -- 获取栈顶元素。
getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
从题意可知,就是要用链表模拟栈。其实用链表模拟栈,队列,用双向链表比较好,逻辑会简化很多。
此题还涉及最小值,所以保留结构体中增加一个min字段就行了。
typedef struct listNode{
int val;
int minv;
struct listNode *next;
struct listNode *pre;
} MinStack;
struct listNode *end = NULL;
MinStack* minStackCreate() {
MinStack* head;
head = (MinStack*)malloc(sizeof(MinStack));
head->next = NULL;
head->pre = NULL;
head->val = 0xfffffff;
head->minv = 0xfffffff;
end = head;
return head;
}
/** Push element x onto stack. */
void minStackPush(MinStack* obj, int x) {
MinStack* new = (MinStack*)malloc(sizeof(MinStack));
new->val = x;
new->next = NULL;
end->next = new;
new->pre = end;
if((end == obj)||(end->minv > new->val)){
new->minv = new->val;
} else {
new->minv = end->minv;
}
end = new;
}
/** Removes the element on top of the stack and returns that element. */
void minStackPop(MinStack* obj) {
MinStack* temp;
end = end->pre;
temp = end->next;
free(temp);
end->next = NULL;
}
/** Get the top element. */
int minStackTop(MinStack* obj) {
return end->val;
}
int minStackGetMin(MinStack* obj) {
return end->minv;
}
void minStackFree(MinStack* obj) {
while(end != obj) {
minStackPop(end);
}
free(obj);
}