设计一个支持 push
,pop
,top
操作,并能在常数时间内检索到最小元素的栈。
实现 MinStack
类:
MinStack()
初始化堆栈对象。void push(int val)
将元素val推入堆栈。void pop()
删除堆栈顶部的元素。int top()
获取堆栈顶部的元素。int getMin()
获取堆栈中的最小元素。
示例 1:
输入: ["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.
思路
在栈中设置min
每次元素入栈都更新一下min
然后把他覆给入的新栈
typedef struct node {
int val;
struct node* next;
int min;
} MinStack;
MinStack* minStackCreate() {
MinStack* node = (MinStack*)malloc(sizeof(MinStack));
node->next = NULL;
node->val = 0;
node->min = 0;
return node;
}
void minStackPush(MinStack* obj, int val) {
MinStack* head = obj;
obj->val++;
MinStack* tail;
while (obj->next)
{
tail = obj;
obj = obj->next;
}
MinStack* node = (MinStack*)malloc(sizeof(MinStack));
node->next = NULL;
obj->next = node;
node->val = val;
if (head->val == 1)
{
node->min = val;
}
else
{
if (obj->min > val)
node->min = val;
else
node->min = obj->min;
}
}
void minStackPop(MinStack* obj) {
obj->val--;
MinStack* node;
while (obj->next)
{
node = obj;
obj = obj->next;
}
node->next = NULL;
free(obj);
}
int minStackTop(MinStack* obj) {
while (obj->next)
{
obj = obj->next;
}
return obj->val;
}
int minStackGetMin(MinStack* obj) {
while (obj->next)
{
obj = obj->next;
}
return obj->min;
}
void minStackFree(MinStack* obj) {
MinStack* node;
while (obj->next)
{
node = obj;
obj = obj->next;
free(node);
}
}
/**
* Your MinStack struct will be instantiated and called as such:
* MinStack* obj = minStackCreate();
* minStackPush(obj, val);
* minStackPop(obj);
* int param_3 = minStackTop(obj);
* int param_4 = minStackGetMin(obj);
* minStackFree(obj);
*/