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_栈的压入弹出序列的主要内容,如果未能解决你的问题,请参考以下文章

栈的压入弹出序列

栈的压入弹出序列

Offer[31] 栈的压入弹出序列

剑指offer 栈的压入弹出序列

剑指offer 栈的压入弹出序列

剑指offer--31栈的压入弹出序列