Codeup 出棧序列統計——DFS

題目描述

棧是常用的一種數據結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩•種:push和pop,前者是將一個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對於給定的n,計算並輸出由操作數序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。 
 

輸入

一個整數n(1<=n<=15) 

輸出

一個整數,即可能輸出序列的總數目。

樣例輸入 Copy

3

樣例輸出 Copy

5

提示

先了解棧的兩種基本操作,進棧push就是將元素放入棧頂,棧頂指針上移一位,等待進棧隊列也上移一位,出棧pop是將棧頂元素彈出,同時棧頂指針下移一位。 
用一個過程採模擬進出棧的過程,可以通過循環加遞歸來實現回溯:重複這樣的過程,如果可以進棧則進一個元素,如果可以出棧則出一個元素。就這樣一個一個地試探下去,當出棧元素個數達到n時就計數一次(這也是遞歸調用結束的條件)。 

參考鏈接

https://www.cnblogs.com/wjw2018/p/9308645.html

分析:

首先容易想到,對於一個數進棧後,有兩種選擇,一是留棧,下一個數進棧;二是直接出棧。所以我們很容易想到使用DFS來解決問題;

注意到,發生選擇的條件是數先進棧,所以我們要先讓數進棧,再去遞歸處理;


int t;
int n;
void DFS(int num,int x,int y){
	if(y==n){
		t++;
		return;
	}
	if(num>0)	DFS(num-1,x+1,y);    //先進棧操作(限制個數),
	if(x>0)	DFS(num,x-1,y+1);         //當棧內有元素是嗎,纔可判斷是否出棧或者留棧,即不操作。
}
int main()
{
	cin>>n;
	DFS(n,0,0);
	cout<<t;
	return 0;
}	

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章