題目描述
棧是常用的一種數據結構,有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;
}