剑指offer 31.栈的压入、弹出序列

题目描述

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

我的解题思路:

模拟入栈与出栈的过程。1.将pushV中的第一个元素压入;2.在pushV中所有元素的入栈过程中,结合popV中元素判定它们是否发生出栈情况:没有元素出栈则继续压入pushV中下一个元素;有元素出栈则将该元素弹出,并继续检测popV中下一个元素;3.检验popV剩余元素是否满足栈s中元素的出栈顺序;

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        int n=pushV.size();
        if(n!=popV.size()){return false;}   //两个队列长度不相等
        if(n==0){return true;}      //两个队列长度相等且都为0,我觉得这种情况返回true
        
        stack<int> s;
        int index1=0,index2=0;     //两个索引指向两个vector
        s.push(pushV[index1++]);   //压入第一个元素后索引index1指向第二个元素
        while(index1<n){           //所有元素入栈
           if(s.top()!=popV[index2]){//栈顶元素与index2索引的元素不同,压入入栈序列的下一个元素
              s.push(pushV[index1++]);
            }
            else{s.pop();index2++;}  //栈顶元素与index2索引的元素相同,则弹出该元素,index2自增以检验后面的元素是否会出栈
        }
        //上面操作完成后,pushV中所有序列都已有过入栈操作,且index2索引位置之前的元素均已出栈
        //继续检验index2索引的元素及索引之后的元素是否符合出栈顺序
        while(index2<n){
            if(popV[index2]==s.top()){s.pop();index2++;}
            else{return false;}
        }
        return true;
    }
};

牛客网大牛的解题方法:

https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 推荐大家看lizo的题解

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值