出栈序列(栈和队列)

Description
已知自然数1,2,...,N(1≤N≤10000)依次入栈(即a<b当且仅当a先于b入栈),问:序列C1,C2,...,CN是否为可能的出栈序列。
  例如:N=5时,3,4,2,1,5是一个可能的出栈序列,因为其可以按如下操作获得:push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop

Input
 输入数据包含若干组测试样例。
  每组测试样例的第一行为整数N(1≤N≤10000);
  第二行为N个正整数,以空格隔开,为出栈序列;
  输入数据的末尾以一个0表示输入的结束。

Output
对于每组测试样例,输出结果为一行字符串。
  如给出的序列是可能的出栈序列,则输出"Yes",否则输出"No"。
  注意:区分大小写,引号本身不输出。

Sample Input
5
3 4 2 1 5
5
3 5 1 4 2
0
Sample Output
Yes
No
Hint

 

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<stack>
 4 using namespace std;
 5 int main()
 6 {
 7     int n,a[10000],i,j,flag;
 8     while(scanf("%d",&n)!=EOF)
 9     {
10         if(n==0)
11             break;
12         stack<int>s;
13         flag=1;
14         for(i=0; i<n; i++)
15         {
16             scanf("%d",&a[i]);
17         }
18         for(i=1; i<a[0]; i++)
19         {
20             s.push(i);
21         }///搞定第一个数
22         for(j=1; j<n; j++)
23         {
24             if(a[j]>a[j-1])///后面的数大于前面的数
25             {
26                 for(i=a[j-1]; i<=a[j]; i++)
27                 {
28                     s.push(i);
29                     s.pop();
30                 }
31             }
32             else
33             {
34 
35                 if(s.top()==a[j])
36                 {
37                     s.pop();
38                 }
39                 else
40                 {
41                     flag=0;
42                     break;
43                 }
44             }
45         }
46         if(flag==1)
47             printf("Yes\n");
48         else
49             printf("No\n");
50     }
51     return 0;
52 }

 

转载于:https://www.cnblogs.com/wkfvawl/p/8675969.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值