数据结构实验之栈与队列七:出栈序列判定

Problem Description

给一个初始的入栈序列,其次序即为元素的入栈次序,栈顶元素可以随时出栈,每个元素只能入栈依次。输入一个入栈序列,后面依次输入多个序列,请判断这些序列是否为所给入栈序列合法的出栈序列。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个出栈序列,但4,3,5,1,2就不可能是该序列的出栈序列。假设压入栈的所有数字均不相等。

Input

 第一行输入整数n(1<=n<=10000),表示序列的长度。

第二行输入n个整数,表示栈的压入顺序。

第三行输入整数t(1<=t<=10)。

后面依次输入t行,每行n个整数,表示要判断的每一个出栈序列。

Output

 对应每个测试案例输出一行,如果由初始入栈序列可以得到该出栈序列,则输出yes,否则输出no。

Sample Input

5
1 2 3 4 5
2
4 5 3 2 1
4 3 5 1 2
题解:每一次将第i个数前的数压入栈,然后将栈顶元素出栈;判断一下第i个数与栈顶元素的大小,若不比栈顶元素大则出栈,否则压栈;

 1 #include <iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 #include<stack>
 5 using  namespace std;
 6 int a[10010];
 7 int main()
 8 {
 9     int i,j,n,p,b,t,m;
10     stack<int>s;
11     scanf("%d",&n);
12     for(i=0; i<n; i++)
13         scanf("%d",&a[i]);
14 
15  cin>>b;
16     for( m=0; m<b; m++)
17     {
18         int k=0,count2=0,count1=0;
19         while(!s.empty())
20         {
21             s.pop();
22         }//清空栈
23         for(j=0; j<n; j++)
24         {
25             scanf("%d",&p);
26             for(i=k; i<n; i++)
27             {
28                 if(!s.empty())//空判断栈是否为非(易造成运行错误,若栈为空)
29                 {
30                     if(s.top()>=p)
31                         break;
32                 }
33 
34                 if(a[i]==p)
35                 {
36                     s.push(a[i]);
37                     k=count2+1;
38                     break;
39                 }
40                 else
41                 {
42                     s.push(a[i]);
43                     count2++;
44                 }
45             }
46             if(s.top()==p)
47                 count1++;
48             s.pop();
49         }
50         if(count1==n)
51             printf("yes
");
52         else
53             printf("no
");
54     }
55     return 0;
56 }
原文地址:https://www.cnblogs.com/moomcake/p/8634332.html