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
來源:牛客網