ACM_栈的压入弹出序列
Posted acgoto
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM_栈的压入弹出序列相关的知识,希望对你有一定的参考价值。
栈的压入、弹出序列
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
Input:
输入一个T,表示理面输入T组数据。每组数据第一行为一个数n,接下来有两行n个数字,第一行代表数字进栈的序列,第二行代表数字出栈的序列。(所有数字不大于50)
Output:
判断出栈序列能不能由进栈序列产生,如果能输出YES,否则输出NO。
Sample Input:
2 5 1 2 3 4 5 4 5 3 2 1 5 1 2 3 4 5 4 3 5 1 2
Sample Output:
YES NO
解题思路:借用一个额外的辅助栈 举个栗子: ①入栈Push序列:1,2,3,4,5 ②出栈Pop序列:4,5,3,2,1 遍历压栈顺序,先将第一个放入辅助栈中,这里是1,然后判断辅助栈的栈顶元素是不是出栈Pop顺序的第一个元素,这里是4,很显然1≠4,所以我们继续将元素压入辅助栈中,直到相等以后辅助栈就开始出栈,出栈一个(栈顶元素)元素,则将出栈Pop顺序向后移动一位,直到不相等,这样一直循环,直到压栈顺序遍历完成,如果这时辅助栈还不为空,说明弹出序列不是该栈的弹出顺序。 简单模拟一下过程:首先1入辅助栈,此时栈顶1≠4,继续入栈2,此时栈顶2≠4,继续入栈3,此时栈顶3≠4,继续入栈4,此时栈顶4==4,出栈4,弹出序列的位置向后移一位,此时为5,辅助栈里面是1,2,3,此时栈顶3≠5,继续入栈5,此时栈顶5==5,出栈5,弹出序列向后一位,此时为3,,辅助栈里面是1,2,3….依次执行,最后辅助栈为空。如果不为空说明弹出序列不是该栈的弹出顺序。
AC代码:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 bool IsPopOrder(vector<int> Push, vector<int> Pop) { 5 if(Push.size()==0)return false; 6 vector<int> vec;//辅助容器 7 for(size_t i=0,j=0;i<Push.size();++i){ 8 vec.push_back(Push[i]); 9 while(j<Pop.size()&&Pop[j]==vec.back()){vec.pop_back();j++;} 10 } 11 return vec.empty();//如果最后vec容器中元素个数为0,说明出栈序列满足条件,返回true 12 } 13 int main(){ 14 vector<int> pushlist; 15 vector<int> poplist; 16 int t,n,x; 17 cin>>t; 18 while(t--){ 19 pushlist.clear();//清空 20 poplist.clear(); 21 cin>>n; 22 for(int i=1;i<=n;++i){cin>>x;pushlist.push_back(x);} 23 for(int i=1;i<=n;++i){cin>>x;poplist.push_back(x);} 24 if(IsPopOrder(pushlist, poplist))cout<<"YES"<<endl; 25 else cout<<"NO"<<endl; 26 } 27 return 0; 28 }
以上是关于ACM_栈的压入弹出序列的主要内容,如果未能解决你的问题,请参考以下文章