剑指offer第二十一题【栈的压入、弹出序列】c++实现

栈的压入、弹出序列
  • 参与人数:1958时间限制:1秒空间限制:32768K
  • 通过比例:22.25%
  • 最佳记录:0 ms|8552K(来自  geeek

题目描述

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

弹出序列的顺序需要满足,如果一个数字弹出,那么到下一个比这个数之后入栈的数字之间的序列,必须是后入栈的先出栈。

题目出栈4 3 5 1 2

5后面的序列1 2 因为1被压在栈底,必须后入栈的先出栈,所以只能以5 2 1的顺序出栈。

bool IsPopOrder(vector<int> pushV,vector<int> popV) {
    if(pushV.empty()){
        return false;
    }
    map<int,int> Hash;
    //用map做一个映射,入栈顺序的值不一定是递增
    for(int i=0;i<pushV.size();i++){
        Hash[pushV[i]]=i+1;
    }
    int now=Hash[popV[0]];//当前最靠后入栈的键值,例如题目给的4 3 5 1 2,now先等于4,再等于5
    for(int i=0;i<popV.size();i++){
        //如果入栈序列中没有这个值
        if(Hash[popV[i]]==0){
            return false;
        }
        if(Hash[popV[i]]>=now){
            now=Hash[popV[i]];
        }else if(Hash[popV[i]]<=Hash[popV[i-1]]){
            continue ;
        }else{
            return false;
        }
    }
    return true;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值