UVa514-Rails-鐵軌--棧的使用

說明:本題只是主要思想代碼,沒有按照OJ上的輸入輸出格式來。要提交OJ的修改下輸入即可。

題目:https://vjudge.net/problem/UVA-514


某城市有一個火車站,鐵軌鋪設如圖6-1所示。有n節車廂從A方向駛入車站,按進站順序編號爲1~n。你的任務是判斷是否能讓它們按照某種特定的順序進入B方向的鐵軌並駛出車站。例如,出棧順序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。


爲了重組車廂,你可以藉助中轉站C。這是一個可以停放任意多節車廂的車站,但由於末端封頂,駛入C的車廂必須按照相反的順序駛出C。對於每個車廂,一旦從A移入C,就不能再回到A了;一旦從C移入B,就不能回到C了。換句話說,在任意時刻,只有兩種選擇:A→C和C→B。

分析:在中轉站C中,車廂符合後進先出的原則,因此是一個棧。代碼如下:(注意while循環中各種情況的分析)

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
const int maxn=1000+10;
int n,target[maxn];
int main(){
    while(cin>>n){
        stack<int> s;
        int A=1,B=1;
        for(int i=1;i<=n;i++) cin>>target[i];
        int ok=1;
        while(B<=n){ //仔細理解、模擬
            if(A==target[B]){A++;B++;}
            else if(!s.empty()&&s.top()==target[B]){B++;s.pop();}
            else if(A<=n) s.push(A++);
            else {ok=0;break;}
        }
        printf("%s\n",ok?"Yes":"No");
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章