#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;
const int maxn = 1000 + 5;
int train[maxn]; //B站的火车要求序列
stack<int> station; //模拟火车进站 后进先出
int n;
int main()
{
while(~scanf("%d", & n) && n) //输入火车长度 并且 长度为0结束程序
{
while(1)
{
memset(train, 0, sizeof(train));
scanf("%d", & train[1]);
if(!train[1])
break; //判第一个元素是否是0 如果是0 就重新输入n
for(int i = 2; i <= n; i ++)
scanf("%d", & train[i]); //继续输入
while(!station.empty())
station.pop(); //一定要清空栈(因为有可能因为上次循环而有数已经存入)
int a = 1; //A站火车是按1,2,....n的序列
int b = 1; //B站火车的下标
while(a <= n)
{
station.push(a); //将a投入栈
while(!station.empty() && station.top() == train[b]) //判断栈顶元素是否可以出栈(循环)
{
station.pop(); //出栈
b ++; //继续判断下一个train[]
}
a ++;
}
if(station.empty()) //如果栈为空 则满足题意
printf("Yes\n");
else
printf("No\n");
}
printf("\n"); //格式
}
return 0;
}
题意:
A站的火车是按1,2,3…n的序列驶入station。再从station驶入B站。问是否可以按B站显示的火车序列驶入。
题解:
这道题的题意我真的是看很久。有的翻译上写着火车可以自由移动,什么鬼,自由移动不就什么序列都可以了么?后来经过几番询问,差不多可以这样理解:只能按1,2,3,…n的顺序驶入station,每个车厢驶入station后,有两种选择,一种是停留在station,另一种选择是驶出sation。按照这个规则,判断是否能产生B站那样的序列。例如: 1 3 2 5 4 ——1入 直接出。2入 停留。3入 直接出。2 出。4入 停留。5入 直接出。4出。这样就能产生 1 3 2 5 4这个序列。此题就是借助栈,也是一道经典的栈问题。