#include <iostream>
#include <stack>
using namespace std;
int main() {
int n;
while (cin >> n && n){
while (1){
int a[n], point = 1;//a陣列 用來存取輸入 point 代表 現在A站中 第一台車廂的編號 假設在A站剛開走4(包含)以下的所有車子
stack <int> stk;//stk為車站 那此時A站的第一台車廂編號為5 ,所以point=5
cin >> a[0];
if (a[0] == 0) break;//如果輸入0 表示資料輸入完畢
for (int i = 1; i < n; i++){//
cin >> a[i];
}
int i;
for (i = 0; i < n; i++){
if (!stk.empty() && stk.top() == a[i]){// 程式碼用途:
stk.pop();// 1.查看車站堆中(stk)的最上層是否有輸入的值
}else if (a[i] >= point){// 2.查看A站中是否有輸入的值 如果有,將輸入值以下的所有車廂推入車站
for (int j = point; j < a[i]; j++){// 假設A有4 3 2 1,而現在只要將4開去B站,那得先將4 3 2 1都開進去車站,才能將4再開出去
stk.push(j);// 所以if else 是在判斷:
}// if(車站中有車 並且 車站堆最上層剛好等於輸入值)->將車子從車站開出去
point = a[i] + 1;// else if(輸入值比point大)->表示車廂在A站,將 輸入值 以下所有A站車廂開去車站 並將point設為 輸入值+1
}else{// else 此種排列為不可能
break;
}
}
if (i == n){//如果i的for迴圈完整執行 那執行完的i會等於n
cout << "Yes" << endl;// 如果仍覺得難懂,可以執行看看以下程式
}else{// int i=0;
cout << "No" << endl;// for(i=0;i<5;i++){cout<<"now i="<<i<<endl;}
} // cout<<"the end of i="<<i<<endl;
} // 最後的the end of i會等於5
cout << endl;
}
return 0;
}
此程式碼全出自
https://yuihuang.com/zj-c123
YUI HUANG 之手 小的只是在旁下註解