/*
每辆火车都从A方向驶入车站,再从B方向驶出车站,同时它的车厢可以进行重新组合。假设火车有n节车厢,分别按顺序编号为1,2,...,n;
负责车厢调度的工作人员需要知道能否使它以 a1,a2,...,an的顺序从B方向驶出。编写程序,判断是否得到制定的车厢顺序。
*/
#include<stdio.h>
#include<string.h>
int a[1010], b[1010],stack[1010];
int main()
{
int n, i, j , k , l;
scanf("%d", &n) ;
while(1)
{
if(n == 0)
break;
while(1)
{
memset(a, 0,sizeof(a));
memset(stack, 0, sizeof(stack));
for(i = 0; i < n; i++)
{
a[i] = i+1;
scanf("%d", &b[i]);
if(b[0] == 0)
break;
}
if( i != n)
break;
l = 0;
for(i = 0; i < n; i++)
{
if( l == 0 || b[i] > stack[l-1] )
{
for(j = l; j < b[i]; j++)// in
{
if(a[j] == 0)
continue;
stack[l++] = a[j];
a[j] = 0;
}
if(stack[l-1] == b[i]) // out
stack[l-1] = 0;
else
break;
l--;
}
else
{
if(stack[l-1] == b[i])// out
{
stack[l-1] = 0;
l--;
}
else
break;
}
}
if(i == n)
printf("Yes\n");
else
printf("No\n");
}
scanf("%d", &n);
if(n != 0)
printf("\n");
}
return 0;
}
最简单的栈!
最新推荐文章于 2023-04-09 13:50:44 发布