IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列

题目描述

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

思路一:找规律区分

/*
 * 思路:出栈序列的第一个数字A可以把入栈序列分为两个部分,一部分是比A早入栈的,一部分是比A晚入栈的
 * 比A早入栈的必须倒序在出栈序列中,比A晚入栈的可以递归查
 */
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size() != popV.size()) return false;
        if(pushV.size() == 0) return true;
        if(pushV.size() == 1 && (pushV[0] == popV[0])) return true;
        if(pushV.size() == 1 && (pushV[0] != popV[0])) return false;

        vector<int> pushVpre;
        vector<int> pushVback;
        vector<int> popVpre;
        vector<int> popVback;
        int firstnum = popV[0];
        int preflag = 0;
        //把入栈序列划分成两部分
        for(vector<int>::iterator itt = pushV.begin(); itt != pushV.end(); itt++){
            if(*itt == firstnum){
                preflag = 1;
            }else{
                if(preflag == 0){
                    pushVpre.push_back(*itt);
                }else{
                    pushVback.push_back(*itt);
                }
            }
        }
        //根据先入栈的必须倒叙出栈,把出栈序列中先入栈的元素删除,剩下的就是晚入栈的,注意出栈序列的第一个不算
        vector<int>::iterator itt = popV.end();
        itt--;
        for(; itt != popV.begin(); itt--){
            if(*itt == pushVpre[0]){
                popVpre.insert(popVpre.begin(),*itt);
                pushVpre.erase(pushVpre.begin());
            }else{
                popVback.insert(popVback.begin(),*itt);
            }
        }
        //把出栈元素也分成两部分后,后入栈和后出栈的元素数量不一致的话,说明顺序不对
        if(pushVback.size() != popVback.size()){
            return false;
        }
        //能进行到这一步,说明先入栈和先出栈的顺序没错,只需要递归对比后入栈和后出栈的顺序对不对就行了
        return IsPopOrder(pushVback, popVback);
    }
};

思路二:简洁高效的走一遍出栈入栈流程

/*
 * 思路二:用一个辅助栈 ,把入栈出栈流程走一遍,最后辅助栈为空说明顺序是对的
 * 举例: 
  入栈1,2,3,4,5 
  出栈4,5,3,2,1 
  首先1入辅助栈,此时栈顶1≠4,继续入栈2 
  此时栈顶2≠4,继续入栈3 
  此时栈顶3≠4,继续入栈4 
  此时栈顶4=4,出栈4,弹出序列向后一位,此时为5,,辅助栈里面是1,2,3 
  此时栈顶3≠5,继续入栈5 
  此时栈顶5=5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3 
  …. 
  依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。
 */
class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.size() == 0 || popV.size() == 0) return false;
        vector<int> stackV;
        for(int i = 0, j = 0; i < pushV.size(); i++){
            stackV.push_back(pushV[i]);
            while(j < popV.size() && stackV.back() == popV[j]){
                stackV.pop_back();
                j++;
            }
        }
        if(stackV.empty()) return true;
        else return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值