《剑指offer》栈的压入、弹出序列

一、题目描述

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

二、输入描述

一个入栈的顺序,一个出栈的顺序。

三、输出描述

判断初栈是否满足该入栈序列的初栈序列

四、牛客网提供的框架

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {

    }
};

五、解题思路

1、用栈保存压栈序列
2、用队列保存初栈序列
3、逐个对入栈序列压栈,每次压栈后执行4,知道全部入栈。
4、判断栈顶元素是否等于队列的队首元素;如果相等出栈,出队列;再执行4,否则执行3。
5、判断压栈的栈和队列是否全都为空,如果是返回true,否则返回false。

六、代码

class Solution {
public:

    stack<int> enterStack;  //入栈栈
    queue<int> popQueue;    //出栈队列


    bool IsPopOrder(vector<int> pushV,vector<int> popV)
    {
        if(pushV.size() != popV.size()) return false;   //长度不相等
        for(int i = 0; i < popV.size(); i++)    //复制出栈序列
        {
            popQueue.push(popV[i]);
        }


        for(int i = 0; i < pushV.size(); i++)   //逐个入栈
        {
            enterStack.push(pushV[i]);  //逐个压入栈

            while(enterStack.size() > 0 && enterStack.top() == popQueue.front())    //栈顶与队首元素相等出栈、出队列
            {
                enterStack.pop();
                popQueue.pop();
            }
        }

        if(enterStack.empty() && popQueue.empty()) return true; //如果栈已经全部压栈,出队列为空,则满足,否则不满足。
        else return false;

    }
};
posted @ 2016-07-15 15:19  chenximcm  阅读(172)  评论(0编辑  收藏  举报