栈的压入、弹出序列:最直观的想法是,使用辅助栈。首先遍历入栈,并将当前入栈元素压入辅助栈,再判断是否辅助栈不为空并且辅助栈栈顶元素等于当前出栈元素,注意这里是while循环,如果是则弹出辅助栈栈顶元素并且将当前出栈元素右移,最后判断辅助栈是否为空,如果是则压入弹出序列匹配,反之则不匹配。

bool IsPopOrder(vector<int> pushV,vector<int> popV) 
{
    stack<int> st; //辅助栈
    int n=pushV.size(); //栈的大小
    int j=0; //遍历出栈
    for(int i=0;i<n;i++) //遍历入栈
    {
        st.push(pushV[i]); //压入元素
        while(!st.empty()&&st.top()==popV[j]) 
        //当辅助栈栈不为空并且辅助栈栈顶等于当前出栈元素
        {
            st.pop(); //弹出元素
            j++; //辅助栈移位
        }
     }
     return st.empty(); //如果栈为空则可以否则不行
}

优化:上述代码使用了辅助栈即使用了额外的辅助空间,那么可不可以将空间复杂度降为O(1)呢?当然可以!直接将入栈当作辅助栈!

bool IsPopOrder(vector<int> pushV,vector<int> popV) 
{
    int i=0,j=0; //i表示入栈作为辅助栈 j表示出栈
    int n=pushV.size(); //栈的大小
    for(int k=0;k<n;k++) //遍历入栈
    {
        pushV[i]=pushV[k]; //入栈压入辅助栈
        while(i>=0&&pushV[i]==popV[j]) //辅助栈不为空且当前辅助栈栈顶等于当前出栈元素
        {
            i=i-1; //出栈
            j=j+1; //下一个出栈元素
        }
        //i变成-1然后退出循环又加1变成0
        i=i+1; //否则继续压入辅助栈
     }
     return i==0; //直至减为0
}