155.最小栈
题目描述:
设计一个支持 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.
思想1:
使用两个栈,一个栈正常存放所有元素,另一个栈存放当前栈中最小的元素
class MinStack { public: /** initialize your data structure here. */ stack<int>S; stack<int>min_S; MinStack() { } void push(int x) { S.push(x); if(min_S.empty()||min_S.top()>=x) min_S.push(x); } void pop() { if(min_S.top()==S.top()) min_S.pop(); S.pop(); } int top() { return S.top(); } int getMin() { return min_S.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(); */
注意:在push时的判定条件不能改为 min_S.empty()||min_S.top()>x ,因为如果push 这三个数 0,1,0的话,在>的情况下,辅助栈是只有一个0的。那么如果pop( )后,此时辅助栈就为空了。在调用getMin( )就无法返回辅助栈的top元素了
思想2:
栈中两个数据位合成一个单元,第一个数据位存放当前数据到末尾的最小值,第二个数据位存放当前数据
代码:
class MinStack { public: /** initialize your data structure here. */ stack<int> s; MinStack() { } void push(int x) { if(s.empty()) { s.push(x); s.push(x); } else { int temp=s.top(); s.push(x); if(x<temp) { s.push(x); } else { s.push(temp); } } } void pop() { s.pop(); s.pop(); } int top() { int temp=s.top(); s.pop(); int top=s.top(); s.push(temp); return top; } int getMin() { return s.top(); } };