问题描述
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
分析
使用两个栈,一个存储值,一个存储最小值;在push数据x的时候直接将值push到值栈,然后判断当前最小值栈的top值是否大于等于x,然后大于等于,就将x push进最小值栈。这里一定要注意是大于等于,有等于的原因是因为pop操作的时候,要检查值栈与最小值栈的top值是否相等,若相等则同时pop,所以等于会保证相等的最小值也到了最小值栈里,pop时只会pop掉一个。
代码
class MinStack {
public:
stack<int> data;
stack<int> min_val;
/** initialize your data structure here. */
MinStack() {
}
void push(int x) {
data.push(x);
if(min_val.empty()||(!min_val.empty()&&min_val.top()>=x)) {
min_val.push(x);
}
}
void pop() {
if(!data.empty()) {
if(!min_val.empty()) {
if(min_val.top() == data.top()) {
min_val.pop();
}
}
data.pop();
}
}
int top() {
if(data.empty()) return 0;
return data.top();
}
int getMin() {
if(min_val.empty()) return 0;
return min_val.top();
}
};