155.最小栈
155. 最小栈 - 力扣(LeetCode)


一、思路分析
题目要求我们设计一个栈,其他的都还好说,C++已经提供好了 stack ,唯一需要我们解决的就是获取栈中最小的数。
思路一:创建一个栈 st 和一个用于存放最小值的变量 min。
第一次入栈的时候,就给 min 存放,后面每次入栈时都比较一下,如果比 min 还小,min 就存放新的值。但是,如果出栈呢?我们不知道上一个最小值是谁,所以这种思路pass
思路二:创建两个栈,一个用来存放数据 _st,一个用来存放最小值 _min_st。
由于存放最小值的变量换为栈,我们就得以知道上一个最小值是谁,目前分析,可行。
当第一个数据入栈,那肯定要给两个栈都入栈。后面入栈的时候,根 _min_st 的栈顶比较,如果小,就给 _min_st 和 _st 都入栈,否则,只给 _st 入栈;出栈的时候,就判断 _st 的栈顶是否根 _min_st 的栈顶一致,一致,两个就都出栈
二、动图演示

三、完整代码
class MinStack {
public:MinStack() {}void push(int val) {_st.push(val);if(_min_st.empty() || val <= _min_st.top()){_min_st.push(val);}}void pop() {if(_st.top() == _min_st.top()){_min_st.pop();}_st.pop();}int top() {return _st.top();}int getMin() {return _min_st.top();}
private:stack<int> _st;stack<int> _min_st;
};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(val);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->getMin();*/
Note:拷贝构造函数会经过初始化列表,对于类类型,会调用它们的拷贝构造,所以我们这里的拷贝构造可以空着不写
