【深搜dfs】Codeup (算法筆記) 出棧序列統計(題目 + 代碼 + 詳細註釋)

題目描述

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

 

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