21. 栈的压入、弹出序列

题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

思路:举个例子来做更容易:例如压入顺序是1 2 3 4 5,弹出序列是 4 5 3 2 1,看一下是怎么操作的:首先压入1,1不等于4,不能弹出,然后压入2,2还是不等于4,接着压入3,,,压入4,这时pop 4,然后接着压入5,再pop5,栈中自顶向下还有3 2 1,依次pop出来,就是对应了序列 4 5 3 2 1;再看一下弹出序列4 3 5 1 2:首先依次压入 1 2 3 4,然后pop4,接着 pop3,接着压入5,pop5,栈中自顶向下还有2和1,不可能先pop1 再pop2,所以 4 3 5 1 2就不可能是该压栈序列的弹出序列。

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size() != popV.size() || pushV.size() == 0 || popV.size() == 0)
            return false;
        vector<int> pushValue;
        for(int i = 0, j = 0; i < pushV.size(); ++ i){
            pushValue.push_back(pushV[i]);
            while(j < popV.size() && popV[j] == pushValue.back()){
                pushValue.pop_back();
                ++ j;
            }
        }
        return pushValue.empty();
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_39605679/article/details/80905687