题目链接:https://leetcode.com/problems/min-stack/
【思路】
-
使用两个栈,一个栈 dataStack 用于保存当前栈中的元素,和普通的栈没区别,另一个栈 minStack 用于保存每一步的最小值
-
push(x)
:先将当前数据 x 压入 dataStack 栈中,然后再判断是否压入 minStack 栈中- 如果 minStack 为空,说明是第一次插入数据,那么 x 也压入 minStack 栈中
- 如果 minStack 不为空,此时需要比较 x(即刚才压入 dataStack 栈中的数据) 和 minStack 栈栈顶的元素的大小关系
- 如果 x 更小或者相等,那么将 x 压入 minStack 中
- 如果 x 更大,那么不需要操作
-
pop()
:先弹出 dataStack 中的栈顶元素 value,然后判断 minStack 是否需要弹出栈顶元素- 比较此时 minStack 的栈顶元素和 value 的大小,因为 minStack 栈顶的元素始终是 minStack 中的最小值,也是 dataStack 中的最小值,所以 value 只能大于或等于 minStack 的栈顶元素
- 二者相等,意味着栈顶元素是上一次被压入的最小值,那么需要弹出 minStack 的栈顶元素
- value 更大,minStack 不弹出栈顶元素
- 比较此时 minStack 的栈顶元素和 value 的大小,因为 minStack 栈顶的元素始终是 minStack 中的最小值,也是 dataStack 中的最小值,所以 value 只能大于或等于 minStack 的栈顶元素
-
top()
:返回 dataSatck 的栈顶元素 -
getMin()
:弹出 minStack 栈顶元素
class MinStack {
public:
MinStack() {
}
void push(int x) {
dataStack.push(x);
if(minStack.empty() || minStack.top() >= x) {
minStack.push(x);
}
}
void pop() {
if(!minStack.empty() && minStack.top() == dataStack.top()) {
minStack.pop();
}
dataStack.pop();
}
int top() {
return dataStack.top();
}
int getMin() {
return minStack.top();
}
private:
stack<int> dataStack,minStack;
};