一个栈存输入的数据。
一个栈存每次输入后,该阶段的最小值。
以空间换时间,每次添加新元素,保存此时最小值元素。

class Solution {
public:
    stack<int> s,min_s;
    vector<int> getMinStack(vector<vector<int> >& op) {
        vector<int> res;
        int op_size = op.size();
        for(int i = 0;i < op_size; i++){
            if(op[i][0] == 1) { // push 
                s.push(op[i][1]);
//当min_s为空或push的值比当前栈中最小值小或等于时,将它push到保存最小值的栈。
                if(min_s.empty() || min_s.top() >= op[i][1]) min_s.push(op[i][1]);
            }
            else if(op[i][0] == 2){
                if(!s.empty()){
// 当s不为空且储存最小值栈中栈顶与要pop的元素一样,两个栈同时pop
                    if(s.top() == min_s.top()) min_s.pop();
                    s.pop();
                }
            }
            else res.push_back(min_s.top());
        }
        return res;
    }
};