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

来源:互联网 发布:淘宝改差评技巧 编辑:程序博客网 时间:2024/05/20 17:39
栈的压入、弹出序列
  • 参与人数: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;}




0 0