演算法的樂趣c/c++ —— 1.2.2入門習題
阿新 • • 發佈:2018-12-26
宣告:摘選自“ 演算法競賽入門經典(第2版)”作者: 劉汝佳 / 陳鋒 ISBN:9787302291077
鐵軌
某城市有一個火車站,鐵軌鋪設如圖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。
解題思路
這是一個明顯的棧問題,首先我們需要建立一個數組list來存放你給定的順序,然後建立一個棧,來暫時存放按順序進入c的資料。加入說你給定的資料時3、2、1、5、4。那麼就是1、2、3按順序進入棧,然後按照LIFO的規則即:3、2、1出棧,然後4、5按順序入棧,按5、4出棧。說明是符合順序的。這個問題的主要思路在於利用棧內資料跟你給定的資料逐個比較。因為規則的限定,入棧順序一定是1、2、3、4、5,但是後面的數字沒入棧之前,前面的數字可能已經出棧了。也就是說,我們不停地入棧,只要棧頂資料跟你給定的資料相同,我們就將其出棧,然後比較新的棧頂資料。
#include<iostream> #include<stack> using namespace std; int n, list[50]; int main() { stack <int> s; int a=1, b=1; bool ok=1; cin >> n; for(int i=1; i<=n; i++) { cin >> list[i]; } while(b < n) { if(a == list[b]) {a++; b++;} else if(!s.empty() && s.top()==list[b]) {s.pop(); b++;} else if(a <= n) s.push(a++); else { ok=0; break;} } cout << endl; if(ok) cout << "Yes"; else cout << "No"; return 0; }