/************************************************************************/
/*
栈的push、pop 序列
题目:输入两个整数序列。其中一个序列表示栈的push 顺序,
判断另一个序列有没有可能是对应的pop 顺序。
为了简单起见,我们假设push 序列的任意两个整数都是不相等的。
比如输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列。
因为可以有如下的push 和pop 序列:
push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,
这样得到的pop 序列就是4、5、3、2、1。
但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。
key:
1:用两个vector保存push序列及pop序列,及一个栈保存push结果;
2:按顺序遍历pop中的数,先查找栈顶元素是否匹配,若匹配,弹出栈顶元素;若不匹配,在push vector中查找,如找到,则push进该数之前的所有数,然后弹出该数,;如找不到,则返回flase
3:重复步骤2,直至pop中所有数都匹配好
*/
/************************************************************************/
#include <iostream>
#include <stack>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;
bool Matches(vector<int>ivPush,vector<int> ivPop)
{
if (ivPush.size()!=ivPop.size())
{
return false;
}
bool result=true;
stack<int>iStack;
vector<int>::iterator begin=ivPush.begin();
for (vector<int>::size_type i=0;i!=ivPop.size();i++)
{
if (iStack.size()!=0&&iStack.top()==ivPop[i])
{
iStack.pop();
}
else
{
vector<int>::iterator cur=find(begin,ivPush.end(),ivPop[i]);
if (cur==ivPush.end())
{
return false;
}
for (vector<int>::iterator iBegin=begin;iBegin<=cur;iBegin++)
{
iStack.push(*iBegin);
}
begin=++cur;
iStack.pop();
}
}
return result;
}
int main()
{
cout<<"input push sequence"<<endl;
vector<int> ivPush,ivPop;
int n;
while (cin>>n)
{
ivPush.push_back(n);
}
cout<<"input pop sequence"<<endl;
cin.clear();
while (cin>>n)
{
ivPop.push_back(n);
}
if (Matches(ivPush,ivPop))
{
cout<<"matches!"<<endl;
}
else
{
cout<<"does not match!"<<endl;
}
return 0;
}