出棧序列統計

2021-06-19 22:31:25 字數 1187 閱讀 8693

問題描述:棧是常用的一種資料結構,有

n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩·種:

push

和pop

,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作,由乙個操作序列可以得到一系列的輸出序列。請你程式設計求出對於給定的

n,計算並輸出由運算元序列1,

2,…,

n,經過一系列操作可能得到的輸出序列總數。

輸入:乙個整數n

輸出:

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

樣例輸入: 3 

樣例輸出: 5

問題分析:

由題目可知,可能的動作只有進棧和出棧,且出棧次數<=入棧次數,因此可修改該問題的表現。假設n=3,建立乙個(n+1)×(n+1)的網格,如下圖所示(以線段交叉點為網格點):

從網格左下角出發,規定向上走一步為一次入棧操作,向右走一步為一次出棧操作,由於出棧次數<=入棧次數,因此可行範圍限定在對角線及其以上區域。設n(m,n)是經過n次入棧,m次出棧後可能的結果數量,由圖可知,入棧n次,出棧m次,是由一次出棧或一次出棧形成的。因此n(m,n)=n(m-1,n)+ n(m,n-1),其中n(0,0)=1,即初始狀態為1;左側邊界表示只能有入棧操作,因此n(0,n)=n(0,n-1)。圖中×表示不可能出現的情況,因此也可以認為是0。這樣n(3,3)便為元素為3的情況下所有可能的出棧序列的次數。

該問題求解需要乙個(n+1)×(n+1)的網格進行輔助運算,所以空間複雜度為o(n

2),由於是從前往後的遞推求解,因此可用兩層迴圈巢狀的方式計算出網格內的所有點,因此時間複雜度為o(n

2)。

源**(c

語言描述,資料輸入輸出均以檔案形式給出,輸入檔案為

input.in

,輸出檔案為

output.out)

#include #include int d[13][13];//預設棧最大為13,如有需要請自行修改

void stack(int m)

} for (i=0;i<=m;i++)

for (i=1;i<=m;i++)

} }}

void main()

出棧序列統計

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

出棧序列統計

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

出棧序列統計

時間限制 1 sec 記憶體限制 128 mb 提交 21 解決 20 提交 狀態 討論版 命題人 外部匯入 棧是常用的一種資料結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩 種 push和pop,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作...