HDU 1022 Train Problem I stack 基础题

本文介绍了一种使用栈数据结构来模拟火车进出单一车站口的算法。通过输入火车进站和预期出站的序列,该算法判断是否可以按预定顺序完成进出站,并输出相应的操作步骤。

题意:

有一个火车站,只有一个口同时用于进入和出去,但不能有2辆或以上同时进出。

给出一个n代表有n辆火车(n<=9),编号分别为1到n。

然后给出2个序列,分别代表火车进站的顺序,火车出站的顺序。

问按照这个进站的顺序,能不能按照这个出站的顺序出站。

若能,输出这个口进出的顺序。

Sample Input
3 123 321
3 123 312
 

 

Sample Output
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
 
直接用stack进行模拟就OK了。
只要确定好什么情况下为Yes,什么情况下为No。
 
 1 #include<cstdio>
 2 #include<stack>
 3 #include<cstring>
 4 using namespace std;
 5 char in[12];
 6 char out[12];
 7 int ans[24];
 8 int main()
 9 {
10     int n;
11     while(scanf("%d",&n)!=EOF)
12     {
13         scanf("%s",in+1);
14         scanf("%s",out+1);
15         memset(ans,-1,sizeof(ans));
16         stack<char>s;
17         while(!s.empty())
18             s.pop();
19         int i=1,j=1;
20         s.push(in[i]);
21         int tot=1;
22         ans[tot++]=0;
23         bool flag=false;
24         while(i<n+1)
25         {
26             while(s.size()&&s.top()==out[j])
27             {
28                 s.pop();
29                 ans[tot++]=1;
30                 j++;
31                 if(j==n+1)
32                     break;
33             }
34             if(j==n+1)
35             {
36                 flag=true;
37                 break;
38             }
39             i++;
40             if(i<=n)
41             {
42                 s.push(in[i]);
43                 ans[tot++]=0;
44             }
45         }
46         if(flag)
47         {
48             printf("Yes.\n");
49             for(int i=1;i<tot;i++)
50                 if(ans[i]==0)
51                     printf("in\n");
52                 else
53                     printf("out\n");
54             printf("FINISH\n");
55         }
56         else
57         {
58             printf("No.\nFINISH\n");
59         }
60     }
61     return 0;
62 }
提交代码

 

 
 

转载于:https://www.cnblogs.com/-maybe/p/4393982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值