【剑指Offer-举例让抽象问题形象化】面试题30:包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
思路
一个比较自然的思路就是定义一个变量保存最小元素,当调用min()的时候返回该元素即可。但是该思路有一个问题,就是将当前最小元素返回后,下一个最小元素就不知道了。我们可以用一个辅助栈来保存入栈过程中的最小元素:
总结如下:
1、当入栈的时候,将入栈元素和辅助栈的栈顶元素相比较(辅助栈不为空的情况下),如果入栈元素较小,则将入栈元素压入数据栈和辅助栈;如果入栈元素较大,则只压入数据栈;如果辅助栈为空,则将数据压入数据栈和辅助栈;
2、当出栈的时候,将数据栈和辅助栈栈顶元素弹出;
3、当获取最小元素时,将辅助栈栈顶元素返回。
代码如下:
class Solution {
public:
stack<int> s; //数据栈
stack<int> s_min; //辅助栈
void push(int value) {
s.push(value);
if(s_min.empty() || value<s_min.top()) // s_min.empty()要在前面
s_min.push(value);
else s_min.push(s_min.top());
}
void pop() {
s.pop();
s_min.pop();
}
int top() {
return s.top();
}
int min() {
return s_min.top();
}
};