棧是常用的一種資料結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩•種:push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列的輸出序列。請你程式設計求出對於給定的n,計算並輸出由運算元序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。
輸入
乙個整數n(1<=n<=15)
輸出
乙個整數,即可能輸出序列的總數目。
樣例輸入
3樣例輸出
5提示
先了解棧的兩種基本操作,進棧push就是將元素放入棧頂,棧頂指標上移一位,等待進棧佇列也上移一位,出棧pop是將棧頂元素彈出,同時棧頂指標下移一位。
用乙個過程採模擬進出棧的過程,可以通過迴圈加遞迴來實現回溯:重複這樣的過程,如果可以進棧則進乙個元素,如果可以出棧則出乙個元素。就這樣乙個乙個地試探下去,當出棧元素個數達到n時就計數一次(這也是遞迴呼叫結束的條件)。
根據提示我們可以知道,這其實就是乙個排列篩選的問題。我們設定的遞迴函式dfs需要兩個引數,乙個是進棧push的元素個數,乙個是出棧pop的元素個數,遞迴裡面每次有兩條路走。
一、出棧pop+1
二、進棧push+1
遞迴結束條件是
1、出棧pop和進棧push個數均達到n,此時滿足條件,計數加1
2、進棧push個數超過n,或者出棧pop個數超過n,或者出棧pop大於進棧push
因此,思路就確定了。
#include
using
namespace std;
int ans =0;
//push記錄進棧個數,pop記錄出棧個數
void
dfs(
int push,
int pop,
int n)
if(push == n && pop == n)
dfs(push +
1, pop, n)
;dfs
(push, pop +
1, n);}
intmain()
遞迴入門 出棧序列統計
題目描述 棧是常用的一種資料結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩 種 push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列的輸出序列。請你程式設計求出對於給定的n,計算並輸出由運算元序列1,2...
問題 E 遞迴入門 出棧序列統計
題目描述 棧是常用的一種資料結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩 種 push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列的輸出序列。請你程式設計求出對於給定的n,計算並輸出由運算元序列1,2...
問題 E 遞迴入門 出棧序列統計
問題 e 遞迴入門 出棧序列統計 命題人 外部匯入 時間限制 1.000 sec 記憶體限制 128 mb 題目描述 棧是常用的一種資料結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩 種 push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這...