C++ 栈的压入、弹出序列

 建一个辅助栈,模拟序列1按序列2顺序的出栈,如1,2,3,4,5和4,5,3,2,1

序列1为空时,首先压入1,序列2的首元素4,不等于当前栈顶,继续压入2,依然不等,继续压入3.........压入4,当前栈顶元素等于序列2的首元素4,此时将4弹出,序列2元素索引加1,此时指向5。

此时栈顶元素为3,不等于5,继续压入序列1的5元素,此时相等,则将栈顶元素5弹出,序列2的索引加1,此时指向3。

此时栈顶元素为3,二者相等,则弹出栈顶元素,序列2索引加1,指向2。

此时栈顶元素为2,与序列2指向元素相等,继续上述操作,直至序列2指向最后一个元素,并且栈中元素全部匹配弹出。此时可判断序列2是序列1的弹出序列。

代码如下:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        int len1=pushV.size();
        stack<int> s1;
        int i=0;
        int j=0;
        while(j<len1)  //序列2中元素全部遍历完时,则停止循环
        {
           while(s1.empty()||s1.top()!=popV[j])
           {
               if(i>len1-1)   //序列1中元素全部压入时,则停止
                   break;
               s1.push(pushV[i]);
               i++;
           }
           if(s1.top()!=popV[j])//按照栈的特性,如果上面的子循环结束时栈顶元素和序列2指向的元素
                                //不等,则表示序列2不是序列1的弹出序列,直接break。
               break;
           s1.pop();
           j++;
        }
       if(s1.empty())
           return true;
        else
            return false;
    }
};

猜你喜欢

转载自blog.csdn.net/zlb666/article/details/87896698