【练习】输入两个整数序列。其中一个序列表示栈的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; }