力扣对应题目链接:155. 最小栈 - 力扣(LeetCode)
牛客对应题目链接:包含min函数的栈_牛客题霸_牛客网 (nowcoder.com)
核心考点 :栈的规则性设计。
一、《剑指Offer》对应内容
二、分析题目
很容易想到,在栈内部保存 min 变量,每次更新的时候,都对 min 变量进行更新。但是,面试官很容易就会问到:如果想拿出第二小,第三小的值怎么拿?
这时再用上面的办法就不行了。为了满足通用,我们使用一个辅助栈,内部保存元素的个数和数据栈完全一样。不过,辅助栈内部永远保存本次入栈的数为所有数据的最小值。
注意:辅助栈内部元素可能会出现 “必要性” 重复。
这里是为了实现算法, 所以就不从 0 开始实现 stack 了。题面说了,保证测试中不会当栈为空的时候,对栈调用 pop() 或者 min() 或者 top() 方法。所以,后面的代码对空的检验可有可无。
三、代码
//力扣 class MinStack { private: stack<int> val_stack; stack<int> min_stack; public: MinStack() {} void push(int val) { val_stack.push(val); if(min_stack.empty() || val<min_stack.top()) min_stack.push(val); else min_stack.push(min_stack.top()); } void pop() { if(val_stack.empty() || min_stack.empty()) return; val_stack.pop(); min_stack.pop(); } int top() { return val_stack.top(); } int getMin() { return min_stack.top(); } }; /** * 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(); */ //牛客 class Solution { private: stack<int> val_stack; stack<int> min_stack; public: void push(int value) { val_stack.push(value); if(min_stack.empty() || value<min_stack.top()) min_stack.push(value); else min_stack.push(min_stack.top()); } void pop() { val_stack.pop(); min_stack.pop(); } int top() { return val_stack.top(); } int min() { return min_stack.top(); } };