题意:火车在A以序列进入中转站B,再离去到达C,判断能否按照给定的先后顺序到达C;由于中转站是火车先进先出,FIFO模型,很容易想到用栈来模拟B;
由A到C有两种可能方案,第一:A->C;第二:A->B->C;
下面是源代码。
#include<cstdio>
#include<stack>
using namespace std;
const int MAXN = 1000 + 10;
int n, target[MAXN];
int main(){
while(scanf("%d",&n) == 1 && n != 0){
while(scanf("%d",&target[1])){
if(target[1] == 0) {
printf("\n");
break;
}
stack<int> s;
int A = 1, B = 1;
int ok = 1;
for(int i = 2; i <= n; i++)
scanf("%d",&target[i]);
while(B <= n){
if(A == target[B]) { A++; B++; } //A->C
else if (!s.empty()&&s.top() == target[B]){
s.pop(); //B->C
B++;
} else if(A <= n) s.push(A++);//将不满足的火车入栈等待
else {
ok = 0; //该车已进入B,但是不在栈首,无法弹出
break;
}
}
printf("%s\n", ok ? "Yes" : "No");
}
}
return 0;
}