#include <stack>
class Solution {
private:
    stack<int> st1;
    stack<int> st2;     // 单调栈 保持非严格递减状态.
public:
    void push(int value) {
        st1.push(value);

        if (st2.empty())
            st2.push(value);
        else {
            if (value <= st2.top()) {
                st2.push(value);
            }
        }
    }
    void pop() {
        int num = st1.top();
        st1.pop();

        // if (st2.empty())
        //     return;
        
        if (num == st2.top())
            st2.pop();
    }
    int top() {
        return st1.top();
    }
    int min() {
        return st2.top();
    }
};

用一个辅助栈来记录当前栈中的最小元素

辅助栈中的元素的存储顺序与元素插入顺序相同,并且维持非严格的单调递减的顺序

这样每次取最小元素的时候只要取辅助栈的栈顶元素即可

注意 :若出栈时使用栈顶元素与辅助栈栈顶元素是否相等来判断是否要弹出辅助栈栈顶元素,则当前插入元素与辅助栈栈顶元素相等时,也应当将该元素插入辅助栈中