【棧】Rails

peterzh6發表於2024-10-08

https://ac.nowcoder.com/acm/contest/22669/D
這次直接ac,很爽

判斷入棧後出棧序列的基本模板,需要熟練掌握

判斷排列是否可行:

初始化 j = 1,表示當前需要匹配的排列序列下標。
for 迴圈遍歷從 1 到 n 的車廂號,模擬將車廂入棧。
每次入棧後,透過 while 迴圈檢查棧頂是否與 in[j] 匹配:
若匹配,說明車廂可以出棧,與目標順序一致,因此將 j++,繼續檢查下一個目標車廂。
若不匹配,則繼續入棧,直到車廂順序符合要求或到達無法匹配的情況。

@Credit 遲緩的小章魚在打卡

using namespace std;
int n;
bool end(){/*end函式用來接收每一個入棧序列的總數,
若是0則直接跳過迴圈*/
    cin >> n ;
    if (n) return true;
    else return false;
}
int in[1010];
int main(){
    while (end()){
        int k;
        stack<int> rails;
        cin >> k;/*k用來接收一個入棧序列塊裡的結束或者繼續訊號,
        下面while迴圈末尾也有一個k的cin接收,結合起來作為訊號來
        結束一個入棧序列塊的判斷*/
        while (k) {
            while(!rails.empty()){
                rails.pop();
                }/*清空rails棧,很關鍵*/
            in[1] = k;/*這裡in陣列的初始化有一點不一樣,因為第一個
            元素作為訊號k參與結束判斷,所以第一個元素初始化比較特殊*/
            for (int i = 2 ; i <= n ; i ++ ){
                cin >> in[i];
            }
            int j = 1 ;
            for (int i = 1 ; i <= n ; i ++ ){/*這裡就是判斷入棧後出棧序列的基本模板,需要熟練掌握*/
                rails.push(i);
                while(!rails.empty() && rails.top() == in[j]){
                    rails.pop();
                    j ++ ;
                }
            }
        if (rails.empty()) 
            cout << "Yes" << endl;
        else 
            cout << "No" << endl;
        cin >> k;
        if (k == 0) cout << endl;
       }
    }
    return 0;
}

作者:遲緩的小章魚在打卡
連結:https://www.nowcoder.com/discuss/623665475055083520
來源:牛客網

相關文章