Leetcode 最小栈
设计一个支持 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.
参考网上思路,为了满足常数时间的要求,一次入栈两个元素,一个是入栈x,一个是当前最小值,用空间换取时间。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct {
int *stack;
int count;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate(int maxSize) {
MinStack *ret;
ret = malloc(sizeof(MinStack));
ret->stack = malloc(sizeof(int)*maxSize);
ret->count = -1;
return ret;
}
int minStackGetMin(MinStack* obj) {
return obj->stack[obj->count];
}
void minStackPush(MinStack* obj, int x) {
int min;
if(obj->count == -1) {
obj->stack[++obj->count] = x;
obj->stack[++obj->count] = x;
} else {
min = minStackGetMin(obj);
obj->stack[++obj->count] = x;
obj->stack[++obj->count] = x < min ? x : min;
}
}
void minStackPop(MinStack* obj) {
obj->count -= 2;
}
int minStackTop(MinStack* obj) {
return obj->stack[obj->count - 1];
}
void minStackFree(MinStack* obj) {
free(obj->stack);
free(obj);
}