1.包含min函数的栈
思路:创建一个辅助栈,每次push时,辅助栈都压入当前的最小值,pop时二者共同pop,min就是返回辅助栈的栈顶。

class Solution {
public:
    stack<int> s1,sMin;
    void push(int value) {
        s1.push(value);
        if(sMin.size()==0||value<sMin.top())
            sMin.push(value);//有新的最小值,压入新的最小值
        else
            sMin.push(sMin.top());//没有,压入旧的最小值
    }
    void pop() {
        if(s1.size()>0&&sMin.size()>0)
        {
            s1.pop();
            sMin.pop();
        }
    }
    int top() {
        return s1.top();
    }
    int min() {
        if(s1.size()>0&&sMin.size()>0)
        {
            return sMin.top();
        }
    }
};

2.栈的压入,弹出序列
思路:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;不在栈顶,就把压栈序列中还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶为止,如果所有数字都压入栈,仍未找到下一个弹出的数字,就返回false。

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
       /*借用一个辅助的栈,遍历压栈顺序,先将第一个放入栈中,这里是1,然后判断栈顶元素是不是出栈顺
       序的第一个元素,这里是4,很显然1≠4,所以我们继续压栈,直到相等以后开始出栈,出栈一个元素,
       则将出栈顺序向后移动一位,直到不相等,这样循环等压栈顺序遍历完成,如果辅助栈还不为空,说明
       弹出序列不是该栈的弹出顺序*/
        if(pushV.size()==0||popV.size()==0) return false;
        stack<int> s1;
        int len=pushV.size();
        int i,j=0;
        for(i=0;i<len;i++)//压栈
        {
             s1.push(pushV[i]);
             while(!s1.empty()&&s1.top()==popV[j])//若相等,出栈,后移一位,再相等就继续出栈后移,不等则压栈
             {
                 s1.pop();
                 j++;
             }

        }
        return s1.empty();             
    }
};