最小栈
题目描述:设计一个支持 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.
题解思路:此题找到栈中最小元素刚开始的思路是每次都循环找最小的元素,但是借鉴别人的做法后,发现每次入栈时,入两次,入当前元素和当前栈的最小元素,保持栈顶是最小元素,次栈顶是真正的栈顶元素。
#define MAX_SIZE 15000
typedef struct {
int *data;
int top;
} MinStack;
/** initialize your data structure here. */
MinStack* minStackCreate() {
MinStack *stack=(MinStack *)malloc(sizeof(MinStack));
stack->data=(int *)malloc(sizeof(int)*MAX_SIZE);
stack->top=0;
return stack;
}
void minStackPush(MinStack* obj, int x) {
if(obj->top==0){
obj->data[obj->top]=x;
obj->top++;
obj->data[obj->top]=x;
obj->top++;
}
else{
int cur_stack_data=obj->data[obj->top-1];
obj->data[obj->top]=x;
obj->top++;
obj->data[obj->top]=(cur_stack_data>x)?x:cur_stack_data;
obj->top++;
}
}
void minStackPop(MinStack* obj) {
if(obj->top>0){
obj->top--;
obj->top--;
}
}
int minStackTop(MinStack* obj) {
return obj->data[obj->top-2];
}
int minStackGetMin(MinStack* obj) {
return obj->data[obj->top-1];
}
void minStackFree(MinStack* obj) {
free(obj->data);
obj->data=NULL;
free(obj);
obj=NULL;
}