題解 出棧序列統計

2021-10-24 13:04:53 字數 1372 閱讀 6486

描述

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

輸入就乙個數n(1≤n≤15)。

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

樣例輸入

3
樣例輸出
5
提示

先了解棧的兩種基本操作,進棧push就是將元素放入棧頂,棧頂指標上移一位,等待進棧佇列也上移一位,出棧pop是將棧頂元素彈出,同時棧頂指標下移一位。

用乙個過程採模擬進出棧的過程,可以通過迴圈加遞迴來實現回溯:重複這樣的過程,如果可以進棧則進乙個元素如果可以出棧則出乙個元素。就這樣乙個乙個地試探下去,當出棧元素個數達到n時就計數一次(這也是遞迴呼叫結束的條件)。

**百煉/練習

看提示很重要!照著提示的第二段,用**翻譯一遍就可以!

傳送門:資料結構與演算法——第一節課實驗題解

#include

using

namespace std;

int cnt=0;

// cnt用來記錄序列種類數

int n;

//遞迴開始了嗷

void

dfs(

int l,

int c,

int r)

//左l,中c,右r,參考下面的**

if(l)

dfs(l-

1,c+

1,r)

;//「如果可以進棧則進乙個元素」

if(c)

dfs(l,c-

1,r+1)

;//「如果可以出棧則出乙個元素」

對於每種出棧元素沒到n的情況,都可以嘗試對它進行兩種操作,即:

這兩種操作,每次只能選乙個進行,進行後得到乙個新的狀態,判斷它是否是遞迴終點,如果是則cnt++;然後結束遞迴,如果不是則將新的狀態引數傳入,再次重複這一過程。

題解 出棧合法性(模擬)

題目描述 已知自然數1,2,n 1 n 100 依次入棧,請問序列c1,c2,cn是否為合法的出棧序列。輸入輸入包含多組測試資料。每組測試資料的第一行為整數n 1 n 100 當n 0時,輸入結束。第二行為n個正整數,以空格隔開,為出棧序列。輸出對於每組輸入,輸出結果為一行字串。如給出的序列是合法的...

出棧序列統計

問題描述 棧是常用的一種資料結構,有 n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩 種 push 和pop 前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列的輸出序列。請你程式設計求出對於給定的 n,計算並輸出由運算元序列...

出棧序列統計

棧是一種常見的資料結構,有許多關於棧的問題,其中之一就是統計元素可能的出棧序列。具體說,就是給定n個元素,依次通過乙個棧,求可能的出棧序列的個數。如果我們用直接模擬的方法,當n較大時會很費時間 另一種方法是利用組合數學求出棧序列個數,得到公式 下面我們來看一種圖形化的方法證明這個等式,很容易理解的。...