题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
我的解题思路:
模拟入栈与出栈的过程。1.将pushV中的第一个元素压入;2.在pushV中所有元素的入栈过程中,结合popV中元素判定它们是否发生出栈情况:没有元素出栈则继续压入pushV中下一个元素;有元素出栈则将该元素弹出,并继续检测popV中下一个元素;3.检验popV剩余元素是否满足栈s中元素的出栈顺序;
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int n=pushV.size();
if(n!=popV.size()){return false;} //两个队列长度不相等
if(n==0){return true;} //两个队列长度相等且都为0,我觉得这种情况返回true
stack<int> s;
int index1=0,index2=0; //两个索引指向两个vector
s.push(pushV[index1++]); //压入第一个元素后索引index1指向第二个元素
while(index1<n){ //所有元素入栈
if(s.top()!=popV[index2]){//栈顶元素与index2索引的元素不同,压入入栈序列的下一个元素
s.push(pushV[index1++]);
}
else{s.pop();index2++;} //栈顶元素与index2索引的元素相同,则弹出该元素,index2自增以检验后面的元素是否会出栈
}
//上面操作完成后,pushV中所有序列都已有过入栈操作,且index2索引位置之前的元素均已出栈
//继续检验index2索引的元素及索引之后的元素是否符合出栈顺序
while(index2<n){
if(popV[index2]==s.top()){s.pop();index2++;}
else{return false;}
}
return true;
}
};
牛客网大牛的解题方法:
https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 推荐大家看lizo的题解