Uva 514 Rails(簡單棧)
阿新 • • 發佈:2019-02-03
/* Note: 題意: 有n節車廂(編號1~n),從A站駛入,經過中轉站C能不能按照所給順序target駛出中轉站 一開始輸入n代表n節車廂,然後輸入出站順序target[],如果能按出站順序出站則輸出Yes,否則No 0代表著處理n節車廂結束,然後重新輸入n,如果n=0,結束program */ #include<cstdio> #include<stack> using namespace std; const int Max = 1010; int target[Max],n; stack<int> s; bool OK(){ while(!s.empty()) //初始化棧 s.pop(); int k=1,p=1; //k控制A站進入C的車廂,p控制C站出去的車廂 while(k<=n && p<=n){ if(k==target[p]) k++, p++; else if(!s.empty() && s.top()==target[p]){ s.pop(); p++; } else{ s.push(k); k++; } } while(!s.empty() && p<=n){ if(s.top()==target[p]){ s.pop(); p++; } else break; } if(p==n+1) //如果全部能按target[]出站返回true return true; else return false; } int main(){ bool flag; while(scanf("%d",&n)!=EOF && n){ flag=true; while(true){ for(int i=1;i<=n;i++){ scanf("%d",&target[i]); if(!target[i]){ //如果target[]為0則可以重新輸出n flag=false; break; } } if(!flag) break; printf("%s\n",OK()?"Yes":"No"); } printf("\n"); //每次處理完n需要輸出一個空行 } } /* 5 1 2 3 4 5 5 4 1 2 3 0 6 6 5 4 3 2 1 0 0 */