155.最小栈
https://leetcode-cn.com/problems/min-stack/
设计一个支持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.最简单粗暴的方法,定义2个栈,多定义的一个栈存最小数
class MinStack {
public:
/** initialize your data structure here. */
stack<int> s;
stack<int> t;
MinStack() {
}
void push(int x) {
s.push(x);
if(t.empty()||x<=t.top()){
t.push(x);
}
}
void pop() {
if(s.top()==t.top()) t.pop();
s.pop();
}
int top() {
return s.top();
}
int getMin() {
return t.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();
*/
2.只使用一个栈,每次输入2个元素,先push当前元素,再push当前最小的元素,保证上面的是小元素,下面的是正常压入栈的元素
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 m=s.top();
s.pop();
int t=s.top();
s.push(m);
return t;
}
int getMin() {
return 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();
*/