题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
解读:(借助于辅助栈)
- 1入栈,栈顶1!=4,继续入栈
- 2入栈,1,2,栈顶2!=4,继续入栈
- 3入栈,1,2,3,栈顶3!=4,继续入栈
- 4入栈,1,2,3,4,栈顶4==4,把4弹出,1,2,3,栈顶3!=4,继续入栈
- 5入栈,1,2,3,5,栈顶5==5,把5弹出,1,2,3,栈顶3==3,把3弹出,1,2,栈顶2==2,把2弹出,1,栈顶1==1,把1弹出
- 最后弹出序列是4,5,3,2,1
- 总结:如果下个是在序列中要弹出的数据正好是栈顶数据,则直接弹出(弹出完,再看栈顶数据是否和下一个要弹出的数据相等),如果和栈顶数据不相等,则把数据继续压入栈,每压入一个数据进去,看一下栈顶数据是否和序列中要弹出的是否相等,一直下去,一直到数据全部都压入栈了,看从栈中弹出的数据是什么情况。
下表列出了1,2,3,4,5与4,5,3,2,1相对应的进入与弹出的顺序:
步骤 | 操作 | 栈中数据 | 弹出的数据 | 栈顶数据 |
1 | 压入1 | 1 | 不弹出,只压入 | 1 |
2 | 压入2 | 1,2 | 不弹出,只压入 | 2 |
3 | 压入3 | 1,2,3 | 不弹出,只压入 | 3 |
4 | 压入4 | 1,2,3,4 | 不弹出,只压入 | 4 |
5 | 弹出4 | 1,2,3 | 4 | 3 |
6 | 压入5 | 1,2,3,5 | 不弹出,只压入 | 5 |
7 | 弹出5 | 1,2,3 | 5 | 3 |
8 | 弹出3 | 1,2 | 3 | 2 |
9 | 弹出2 | 1 | 2 | 1 |
10 | 弹出1 | 无 | 1 | 无 |
但是对于 1,2,3,4,5要弹出4,3,5,1,2会出现下表所示情况(当把所有数据都压入进去了,还没有把所要的数按顺序弹出来):
步骤 | 操作 | 栈中数据 | 弹出的数据 | 栈顶数据 |
1 | 压入1 | 1 | 不弹出,只压入 | 1 |
2 | 压入2 | 1,2 | 不弹出,只压入 | 2 |
3 | 压入3 | 1,2,3 | 不弹出,只压入 | 3 |
4 | 压入4 | 1,2,3,4 | 不弹出,只压入 | 4 |
5 | 弹出4 | 1,2,3 | 4 | 3 |
6 | 弹出3 | 1,2 | 3 | 2 |
7 | 压入5 | 1,2,5 | 不弹出,只压入 | 5 |
8 | ||||
9 | ||||
10 |
代码:
class solution{
public bool IsPopOrder(vector<int> pushVec,vector<int> popVec)
{
vector<int>::iterator pushVec_iter=pushVec.begin();
vector<int>::iterator popVec_iter=popVec.begin();
stack<int> S;
while(popVec_iter!=popVec.end())
{
while((S.empty()||S.top()!=*popVec_iter)&&pushVec_iter!=pushVec.end())
{
S.push(*pushVec_iter);
pushVec_iter++;
}
if(S.top()!=*popVec_iter);
break;
S.pop();
popVec_iter++;
}
if(S.empty()&&popVec_iter==popVec.end())
return true;
else
return false;
}
}