题目描述:
某城市有一个火车站,铁轨铺设如图所示。
有n节车厢从A方向驶入车站,按进站顺序编号1~n。
现让这些火车按照某种特定的顺序进入B方向的铁轨并驶出车站。
为了重组车厢,可以借助中转站C。
C是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。
对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。
换句话说,在任意时刻,只有两种选择:A→C和C→B。
请编程判断判断:按给定的出站顺序,火车能否出站。
样例输入:
5
1 2 3 4 5
5
5 4 1 2 3
6
6 5 4 3 2 1
样例输出:
Yes
No
Yes
#include <iostream>
#include <stack>
using namespace std;
int main(){
//n:火车车厢数
//target:用于存放输入的车厢顺序
int n, target[1000];
while(scanf("%d",&n) == 1){
stack<int> s;
//A为原始队列的活动下标,B为target的活动下标
int A = 1, B = 1;
for(int i = 1;i <= n;i ++){
scanf("%d",&target[i]);
}
bool ok = true;
while(B <= n){
// 优化
// if(A == target[B]){
// A++;
// B++;
// }else
if(!s.empty() && s.top() == target[B]){
s.pop();
B++;
}else if(A <= n){
s.push(A++);
}else{
ok = false;
break;
}
}
printf("%s\n",ok?"Yes":"No");
}
return 0;
}