/*
题目大意:
以固定的顺序输入,以指定的顺序输出,中间是一个栈
*/
#include <iostream>
#include <stdio.h>
#include <stack>
#define MAXN 1010
using namespace std;
stack <int> s;
int tail[MAXN];
int main(void)
{
int n;
while (scanf("%d", &n) != EOF && n)
{
while (true)
{
for (int i = 1; i <= n; i++)
{
scanf("%d", &tail[i]);//出站的要求
if (!tail[i])
break;
}
if (!tail[1])
break;
int A = 1, B = 1;
//A表示当前压入的数据,B表示此时需弹出的数据再tail数组中的位置
bool ok = true;//判断是否能够按出站顺序弹出
while (B <= n)
{//B在完全按照顺序弹出后,自然结束循环
if (tail[B] == A)
{//如果当前的A恰好和此时的需要弹出的数据相同,那根本就不需要把他存入栈直接移过去就好了
A++;
B++;
}
else if (!s.empty() && s.top() == tail[B])
{//如果栈中有数字,且栈顶和需要弹出的数据相同,把栈顶数据弹出
s.pop();
B++;
}
else if (A <= n)
s.push(A++);//如果A中的数据没有完全压入,且没有符合B的数据就把当前的A压入栈
else
{
ok = false;
break;//全都没有了,就凉了吧!!!
}
}
if (ok)
printf("Yes\n");
else
printf("No\n");
s.emplace();
}
putchar('\n');
}
return 0;
}
UVA - 514 - Rails
最新推荐文章于 2024-08-07 19:21:33 发布