题干略。
分析,从A开往C的车一定是按顺序的:1,2,3....,用A表示A站开往B站的车的编号,定义栈C储存C站的车辆编号,车厢进B站的顺序输入后存在数组B[],S为当前是第几节车厢要进B站,初始S=1。
A从1~n判断,若A==B[S],直接进B站,S++,A++;
第一条没有满足时:若C栈不空,判断栈顶与B[S]是否相等,相等的话S++,弹出栈顶元素;
前两条都没有满足时:在A站车厢没有全部进B站时,A++,C.push(A);
前三条均不满足时:说明A站已空,但是,C栈栈顶元素仍不能进入B站,则该测试样例不能实现。
代码:
#include <iostream> #include <stack> using namespace std; const int maxn=1000+10; stack <int> c; int main(){ int a,b[maxn],s,ok,n; L1: while(scanf("%d",&n),n){ L: cin>>b[1]; if(b[1]==0) { cout<<endl;goto L1;} for(int i=2;i<=n;i++){ cin>>b[i]; } a=ok=s=1; while(s<=n){ if(a==b[s]){ a++;s++; } else if(!c.empty() && c.top()==b[s]){ s++;c.pop(); } else if(a<=n) { c.push(a++); } else { ok=0;break; } } printf("%s ",ok?"Yes":"No"); goto L; } return 0; }