一:题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
二:解题思路
解决这个问题,就根据题目模拟栈的入栈和出栈的过程
如入栈顺序1,2,3,4,5 出栈的顺序4,5,3,2,1
借助一个辅助栈,模拟入栈和出栈的过程
1,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同
2,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同
3,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同
4,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同
4出栈,出栈顺序当前元素为5,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,不同
5,入栈,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同
5出栈,出栈顺序当前元素为3,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同
3出栈,出栈顺序当前元素为2,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同
2出栈,出栈顺序当前元素为1,栈非空,判断栈顶元素是否与出栈顺序当前元素相同,相同
1出栈,出栈顺序当前元素为X,栈空
栈空同时与出栈顺序全部比较完成,返回true
综上:解决该问题需要一个辅助栈,按照第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从栈中弹出数字
三:代码实现
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()==0 && popV.size()==0)
return true;
if(pushV.size()!=popV.size())
return false;
stack<int> data;
int i;//pushV
int j=0;//popV
//按照压栈顺序,依次将元素压入栈中
for(i=0;i<pushV.size();i++){
data.push(pushV[i]);
//如果栈顶元素与出栈序列元素相同,则出栈
while(!data.empty() && j<popV.size() && data.top()==popV[j]){
j++;
data.pop();
}
}
if(data.empty() && j==popV.size())
return true;
else
return false;
}
};