栈的压入、弹出序列
- 参与人数: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;
}