题目大意:某城市有一个火车站,铁轨成Y字形,有n节车厢从A方向驶入车站,按进站顺序编号1-n,现在给你一个序列代表进入B的顺序,你可以借助一个C中转站,问能否可以按这样的序列驶入B。
解题思路:栈模拟,中转站就代表栈,将车厢入栈后,只能从栈顶一个一个出去。注意输出每个cas都有一个空行。
代码:
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int N = 1005;
int tail[N], n;
stack<int> s;
bool ok () {
while (!s.empty()) {
s.pop();
}
int k = 1;
int p = 0;
while (k <= n && p < n) {
if (k == tail[p]) {
p++;
k++;
} else if (!s.empty() && s.top() == tail[p]) {
s.pop();
p++;
} else {
s.push (k);
k++;
}
}
while (!s.empty() && p < n) {
if (s.top() == tail[p]) {
s.pop();
p++;
} else
break;
}
if (p == n)
return true;
return false;
}
int main () {
bool flag;
while (scanf ("%d", &n) && n) {
flag = 1;
while (1) {
for (int i = 0; i < n; i++) {
scanf ("%d", &tail[i]);
if (!tail[i]) {
flag = 0;
break;
}
}
if (!flag)
break;
printf ("%s\n", ok() ? "Yes": "No");
}
printf ("\n");
}
return 0;
}