【问题】
设计一个支持 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.
【思路】一个很简单的方法就是使用"双栈思想",第一个栈为pushS,用于保存压入MinStack对象中的数据,而minS为储存各个阶段的最小值,并按照大小顺序进行排列。
假设压栈顺序为:5,4,1,1,6,7,2
则pushS的入栈顺序为:5,4,1,1,6,7,2
minS的入栈顺序为:5,4,1,1
其中注意一个问题,minS中的顺序是单调不增的,如果最小值为1,如果再压入一个值还是1的话,minS中也要压入一个数值为1.
class MinStack { public: /** initialize your data structure here. */ stack<int> minS; stack<int> pushS; MinStack() { } void push(int x) { pushS.push(x); if(minS.empty() || x <= minS.top()){ minS.push(x); } } void pop() { if(minS.top() == pushS.top()){ minS.pop(); } pushS.pop(); } int top() { return pushS.top(); } int getMin() { return minS.top(); } }; /** * Your MinStack object will be instantiated and called as such: * MinStack* obj = new MinStack(); * obj->push(x); * obj->pop(); * int param_3 = obj->top(); * int param_4 = obj->getMin(); */