输入两个整数序列,第一个表示压栈顺序,判断第二个序列是否为该栈的弹出序列?
分析:
- 此题解法就是人判断时的做法。想想人工判断时的步骤,先设一个辅助栈。
- 大循环:弹出序列完成
- 初始栈为空,按照压栈顺序压入。当栈顶元素不等于弹出序列顶时,继续压栈。直至压栈顺序压完,或者当前栈顶和弹出序列顶相同
- 出小循环,判断哪种情况出来的。如果栈顶和弹出序列顶不同,说明没等到,跳出大循环。否则属于遇到相等的,则栈顶弹出。弹出序列顶++
- 最终判断:栈空且弹出序列完成。
代码:
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
bool res = false;
vector<int>::iterator pnextpush = pushV.begin();
vector<int>::iterator pnextpop = popV.begin();
stack<int> s;
// 当弹出序列没完时
while(pnextpop != popV.end())
{
// 初始栈空或栈顶不是弹出序列顶时,压栈
while(s.empty() || s.top() != *pnextpop)
{
// 压栈序列完了,跳出
if(pnextpush == pushV.end())
break;
s.push(*pnextpush);
pnextpush++;
}
// 栈顶不等于弹出序列顶,则跳出
if(s.top() != *pnextpop)
break;
// 弹栈,第一个序列匹配
s.pop();
pnextpop++;
}
// 弹出序列弹完,且栈为空,说明匹配
if(s.empty() && pnextpop==popV.end())
res = true;
return res;
}
};
// 测试
int _tmain(int argc, _TCHAR* argv[])
{
int i,tmp;
vector<int> push;
vector<int> pop;
for(i=0;i<5;++i)
{
cin >> tmp;
push.push_back(tmp);
}
for(i=0;i<5;++i)
{
cin >> tmp;
pop.push_back(tmp);
}
Solution s;
cout << s.IsPopOrder(push, pop) << endl;
return 0;
}