《剑指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;

    }
};
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值