某城有一火车站,有n节车厢从A方向驶入车站,按进站顺序为1~n,要求:让它按照某种特定顺序进入B方向的铁轨并驶出车站。其中有一个中转站C,用来重组车厢。
A有俩种方式出站,一是借助中转站C,这涉及到栈的问题,二是直接从B出去。所以要判断出站顺序就只要判断B出站的车厢在此时的A与以C作为中转站的栈的栈顶是否存在就行。
所以要求将1到n顺序添加,如果能够满足B出站车厢直接出栈,否则进栈,若A中不存在车厢了,而且栈顶无法匹配此时B出站的车厢就错误了!注意逻辑转换!!!
#include<iostream> #include<cstdio> #include<string> #include<set> #include<vector> #include<stack> #include<queue> #include<algorithm> using namespace std; const int maxn=1005; int main() { int n; int flag=1; while(cin>>n) { if(flag>1) cout<<endl; if(n==0) break; int x[maxn]; cin>>x[1]; while(x[1]!=0) { for(int i=2;i<=n;i++) cin>>x[i]; int A=1,B=1; stack <int >s; int ok=1; while(B<=n) { if(A==x[B]) {A++;B++;} else if(!s.empty()&&s.top()==x[B]) {s.pop();B++;} else if(A<=n) {s.push(A++);} else { ok=0; break; } } printf("%s ",ok ?"Yes":"No"); flag++; cin>>x[1]; } } return 0; }