题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
//添加代码
}
};
分析:假设 pushV={1,2,3,4,5},popV={4,5,3,2,1}。
首先由pushV.size()可以得到元素个数length,
创建一个辅助栈stackData,将pushV首元素压入到辅助栈中,然后判断与popV中的第一个元素是否相等,若不等,继续将pushV中的元素压入到辅助栈中,每次压入后判断是否与popV中的第一个元素是否相等,直到相等为止。然后将stackData中栈顶元素弹出,继续比较stackData中剩余元素是否与popV中的第二个元素相等,若不等,继续将pushV中的元素压入到辅助栈中,每次还是判断是否与popV中的第二个元素相等,若相等,弹出stackData中栈顶元素。。。依次执行下去,最后若stackData为空,说明popV可以是pushV的一个弹出序列。
示例:
1)依次将pushV中元素1、2、3压入到辅助栈stackData中,直到找到弹出序列popV中的第一个元素4。
stackData: 1 stackData: 2 .... stackData: 4
1 3
2
1
2)将辅助栈stackData栈顶元素4弹出,此时的栈顶元素3与popV中第二个元素5不相等,继续将pushV中元素5压入到辅助栈stackData中,此时栈顶元素5与popV中第二个元素5相等,如下:
stackData: 5
3
2
1
3) 将 辅助栈stackData栈顶元素5弹出,此时的栈顶元素3与popV中第三个元素3相等,弹出stackData栈顶元素3,此时栈顶元素为2,与popV中第四个元素2相等,弹出tackData栈顶元素2,此时此时栈顶元素为1,与popV中第五个元素1相等,弹出。4)此时的stackData为空栈,则说明存在一种入栈和出栈操作使得popV为pushV的弹出序列。
代码如下:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
int length=pushV.size( );
bool possible=false;
if(!pushV.empty( )&&!popV.empty( )&&length>0)
{
stack<int> stackData;
int pop_index=0;
for(int i=0;i<length;i++)
{
stackData.push(pushV[i]);
while( !stackData.empty()&&stackData.top()==popV[pop_index]) //一定注意要判断stackData.empty()
{
stackData.pop( );
pop_index++;
}
if(stackData.empty())
{
possible=true;
return possible;
}
}
return possible;
}
}
};