面试题30.包含min函数的栈
题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
思路
- 当一个元素入栈之后,我们取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将最小值进入辅助栈
- 当一个元素要出栈时,将辅助栈栈顶元素一并弹出
- 在任意一个时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中
代码
class MinStack {
stack<int> x_stack;
stack<int>min_stack;// 辅助栈 存储最小值
public:
/** initialize your data structure here. */
MinStack() {
min_stack.push(INT_MAX);// 现存入一个较大值
}
void push(int x) {
// 先将元素入栈
x_stack.push(x);
// 然后将x与辅助栈栈顶元素进行对比 看看谁最小
min_stack.push(::min(min_stack.top(),x));
}
void pop() {
x_stack.pop();
min_stack.pop();// 当一个元素要出栈之后,辅助栈栈顶元素也要弹出
}
int top() {
return x_stack.top();// 取出栈顶元素
}
int min() {
return min_stack.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->min();
*/