http://vjudge.net hzu_new_stack A题
There is a famous railway station in PopPush City. Country there is incredibly hilly. The
station was built in last century. Unfortunately, funds were extremely limited that time.
It was possible to establish only a surface track. Moreover, it turned out that the
station could be only a dead-end one (see picture) and due to lack of available space
it could have only one track.
The local tradition is that every train arriving from the direction A continues in the
direction B with coaches reorganized in some way. Assume that the train arriving from
the direction A has N <= 1000 coaches numbered in increasing order 1, 2, ..., N. The
chief for train reorganizations must know whether it is possible to marshal coaches
continuing in the direction B so that their order will be a1, a2, ..., aN. Help him and
write a program that decides whether it is possible to get the required order of
coaches. You can assume that single coaches can be disconnected from the train
before they enter the station and that they can move themselves until they are on the
track in the direction B. You can also suppose that at any time there can be located as
many coaches as necessary in the station. But once a coach has entered the station it
cannot return to the track in the direction A and also once it has left the station in the
direction B it cannot return back to the station.
Input
The input consists of blocks of lines. Each block except the last describes one train
and possibly more requirements for its reorganization. In the first line of the block there
is the integer N described above. In each of the next lines of the block there is a
permutation of 1, 2, ..., N. The last line of the block contains just 0.
The last block consists of just one line containing 0.
Output
The output contains the lines corresponding to the lines with permutations in the input.
A line of the output contains Yes if it is possible to marshal the coaches in the order
required on the corresponding line of the input. Otherwise it contains No. In addition,
there is one empty line after the lines corresponding to one block of the input. There is
no line in the output corresponding to the last ``null'' block of the input.
Sample Input
5
1 2 3 4 5
5 4 1 2 3
0
6
6 5 4 3 2 1
0
0
Sample Output
Yes
No
Yes
题目大意:如图,中间是一个栈,按(1~N)顺序排好的N节火车箱,从A方向入栈,有两种出轨道B的方式:1.每节车厢在入栈前脱离火车并自动移动到B轨道上。2.按顺序存入栈中,然后再按先进后出的规则到轨道B。即,只有1,2,3...N和N,N-1...2,1两种出栈方式。
输入:
第一行输入火车车厢个数n
接下去若干行各输入n个数据
若输入0,则重新输入火车车厢个数n
若火车车厢个数输入为0,则退出循环
输出:
在若干行输出数据的下一行输出"YES"或"NO"。
解题思路:
用栈解决。再定义一个n字节的数组表示预定的输出序列。
1.用for循环在栈中逐个存放固定序列的数并判断栈顶元素等不等于预定的输出元素。
2.如果等于则入栈后出栈,否则入栈,进入下一轮循环。
3.若预定的输出全部输出,则返回“Yes”
相应代码:
include
include
include
include
include
using namespace std;
int main()
{
int n;
int dd[1030];
while(scanf("%d",&n)&&n)//从A方向进入的火车箱个数
{
stack
scanf("%d",&dd[1]);//判断是否继续键入火车序列
while(dd[1])
{
for(int j=2; j<=n; j++)
scanf("%d", &dd[j]);//输入计划火车出来的顺序
int k=1;
for(int j=1; j<=n; j++)
{
p.push(j);//按顺序入栈
while(!s.empty()&&s.top()==dd[k]) //如果入栈车厢等于栈顶车厢,出栈
{
s.pop();
k++;
}
}
if(k-1==n) // 全部出栈
puts("Yes");
else
puts("No");
memset(dd,0,sizeof(dd));
scanf("%d",&dd[1]);//判断是否继续键入同数量级别的火车厢
}
printf("\n");
}
return 0;
}