1. 程式人生 > >演算法的樂趣c/c++ —— 1.2.2入門習題

演算法的樂趣c/c++ —— 1.2.2入門習題

宣告:摘選自“ 演算法競賽入門經典(第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;
}