問題描述:棧是常用的一種資料結構,有
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,前者是將乙個元素進棧,後者是將棧頂元素彈出。現在要使用這兩種操作...