UVa514

UVa514

学完栈的知识后,第一次运用,也是第一次知道有现成的stack

这是《算法竞赛入门经典》上的题目,但是书上的代码是过不了的,主要是输入输出的格式不对,但是思路是ok的

根据题目意思描述,辅助铁轨C只能先进后出,符合栈的特性

进入的火车要么进入C,要么直接出去
出去的火车要么从C出去,要么从A出去

还有火车从C栈驶出之前,要判断栈是否为空,不然是会出错的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<stdio.h>
#include<iostream>
#include<stack>
#define MAXN 1005
using namespace std;
int n,tar[MAXN];
int main()
{
while(cin>>n&&n)
{
stack<int>s; //看作是辅助铁轨C,先进后出
while(cin>>tar[1]&&tar[1])
{
for(int i=2;i<=n;i++)
scanf("%d",&tar[i]);//输入火车驶出的顺序
int a=1,b=1;//标记铁轨a,b的顺序
int flag=1;//标记能否成功
while(b<=n)
{

if(tar[b]==a)
{
a++;b++;//火车从a直接驶出
}
else if(!s.empty()&&tar[b]==s.top())
{
s.pop();//火车从c驶出
b++;
}
else if(a<=n)
{
s.push(a);//火车驶入c
a++;
}
else
{
flag=0;break;//说明顺序不对
}
}
printf("%s\n",flag?"Yes":"No");
}
printf("\n");
}
return 0;
}