您的位置:首页 > 其它

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

2017-05-28 16:51 417 查看

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: