剑指offer面试题[22]-栈的压入、弹出序列

题目描述

       输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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) {
       //添加代码
         
    }
};

分析:假设 pushV={1,2,3,4,5},popV={4,5,3,2,1}。

       首先由pushV.size()可以得到元素个数length,

       创建一个辅助栈stackData,将pushV首元素压入到辅助栈中,然后判断与popV中的第一个元素是否相等,若不等,继续将pushV中的元素压入到辅助栈中,每次压入后判断是否与popV中的第一个元素是否相等,直到相等为止。然后将stackData中栈顶元素弹出,继续比较stackData中剩余元素是否与popV中的第二个元素相等,若不等,继续将pushV中的元素压入到辅助栈中,每次还是判断是否与popV中的第二个元素相等,若相等,弹出stackData中栈顶元素。。。依次执行下去,最后若stackData为空,说明popV可以是pushV的一个弹出序列。

       示例:

       1)依次将pushV中元素1、2、3压入到辅助栈stackData中直到找到弹出序列popV中的第一个元素4。

         stackData: 1      stackData: 2     ....     stackData: 4   

                                                          1                                   3

                                                                                               2

                                                                                               1

       2)将辅助栈stackData栈顶元素4弹出,此时的栈顶元素3与popV中第二个元素5不相等,继续pushV中元素5压入到辅助栈stackData中,此时栈顶元素5与popV中第二个元素5相等,如下:

                                                                          stackData: 5   

                                                                                               3

                                                                                               2

                                                                                               1

      3) 辅助栈stackData栈顶元素5弹出,此时的栈顶元素3与popV中第三个元素3相等,弹出stackData栈顶元素3,此时栈顶元素为2,与popV中第四个元素2相等,弹出tackData栈顶元素2,此时此时栈顶元素为1,与popV中第五个元素1相等,弹出。

      4)此时的stackData为空栈,则说明存在一种入栈和出栈操作使得popV为pushV的弹出序列。

 代码如下:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
    
       int length=pushV.size( );

       bool possible=false;

       if(!pushV.empty( )&&!popV.empty( )&&length>0)
       {

              stack<int> stackData;

              int pop_index=0;

              for(int i=0;i<length;i++)

                 {

                        stackData.push(pushV[i]);

                        while( !stackData.empty()&&stackData.top()==popV[pop_index]) //一定注意要判断stackData.empty()

                            {

                                   stackData.pop( );

                                   pop_index++;

                            }

                         if(stackData.empty())

                             {

                                     possible=true;

                                     return possible;    

                             }

                 }

               return possible;    

       }
    }
};

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rs勿忘初心

您的鼓励将是我的最大创动原动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值