【练习】输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序

/************************************************************************/
/*
栈的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;
}

  

posted @ 2011-11-24 11:14  refazy  阅读(2104)  评论(0编辑  收藏  举报