Leetcode 最小栈
题目描述
设计一个支持 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.
代码
该题的思路较为简单,一开始我以为是要从底层实现一个自定义的栈,这道题只是用了一个辅助栈来帮助实现功能,每次有数据入栈时判断当前最小元素是哪个并存入专门存放最小元素的辅助站中。
注意两个栈定义的位置,也可以定义在public内,但时间会增加。以及Minstack函数内给存放最小元素的栈预存放了一个最大值。
class MinStack {
stack<int> stackdata;
stack<int> stackmin;
public:
/** initialize your data structure here. */
MinStack() {
stackmin.push(INT_MAX);
}
void push(int val) {
stackdata.push(val);
if(stackmin.empty())//该判断也不是必须的,题目注意事项里有说pop、top 和 getMin 操作总是在非空栈上调用。
{
stackmin.push(val);
}
else
{
int tmp = stackmin.top();
int min = tmp>val ? val: tmp;
stackmin.push(min);
}
}
void pop() {
if(!stackdata.empty())
{
stackdata.pop();
stackmin.pop();
}
}
int top() {
return stackdata.top();
}
int getMin() {
return stackmin.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/