題目描述
棧是常用的一種數據結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩•種:push和pop,前者是將一個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對於給定的n,計算並輸出由操作數序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。
輸入
一個整數n(1<=n<=15)
輸出
一個整數,即可能輸出序列的總數目。
樣例輸入 Copy
3
樣例輸出 Copy
5
提示
先了解棧的兩種基本操作,進棧push就是將元素放入棧頂,棧頂指針上移一位,等待進棧隊列也上移一位,出棧pop是將棧頂元素彈出,同時棧頂指針下移一位。
用一個過程採模擬進出棧的過程,可以通過循環加遞歸來實現回溯:重複這樣的過程,如果可以進棧則進一個元素,如果可以出棧則出一個元素。就這樣一個一個地試探下去,當出棧元素個數達到n時就計數一次(這也是遞歸調用結束的條件)。
//分析:模擬棧的操作,每一步有兩種選擇:入棧和出棧,分別選擇即可,重要的是判斷還有沒有次數
//下面是我AC的代碼:
#include<bits/stdc++.h>
using namespace std;
int n, ans; //ans儲存結果
void dfs(int in, int out, int num) { //in表示剩餘的入棧次數,out表示剩餘的出棧次數
if (!in && !out) { //入棧和出棧次數用完,說明生成了一個序列
ans++;
return;
}
if (in) dfs(in - 1, out, num + 1); //有入棧次數,就可以入棧
if (out && num) dfs(in, out - 1, num - 1); //有出棧次數並且棧內還有元素,就可以出棧
}
int main() {
cin >> n;
dfs(n, n, 0); //初始化爲n n 0
cout << ans << endl; //輸出結果
return 0;
}