出棧序列的求解方法

2022-04-10 23:04:40 字數 824 閱讀 7009

假如現在有這麼乙個問題:

乙個序列從1到n依次入棧,那麼可能的出棧序列一共有多少種?

注意:在任意乙個時刻,只要棧不為空,就可能有元素出棧,不是說元素全部入棧之後再出棧。

這個問題的解其實等同於求n階的卡特蘭數(catalan)

卡特蘭數指的是在乙個n*n的方格中,從左下角走到右上角。每一步只能往右或者往上,且在走的過程中不能越過從左下角到右上角的那條對角線。

和入棧出棧問題對比可以發現,這裡的往右走就相當於入棧,往上走就相當於出棧,對角線上的點就相當於棧為空的時候, 不能越過對角線就是說在棧為空的時候不能執行彈棧操作。

既然往右相當於入棧, 往上相當於出棧,那麼從左下角到右上角的路徑即為對應的入棧出棧操作序列,我們可以執行全部的操作序列來獲取全部的出棧序列。所以求解出棧序列的個數,只需求出搜尋路徑有多少個。

當棧深度為4時,所有可能的搜尋路徑(入棧出棧操作序列):

那麼搜尋又要如何實現?

首先合理的搜尋需要滿足兩個前提:

搜尋的遞迴實現:

#include #include void catalan(int push, int pop, int n, char *order) 

if (push < n)

if (pop < push)

}int main()

參考鏈結[1]

棧(出棧序列)

已知自然數1,2,n 1 n 10000 依次入棧 即a1 c2,cn 是否為可能的出棧序列。例如 n 5時,3,4,2,1,5是乙個可能的出棧序列,因為其可以按如下操作獲得 push 1,push 2,push 3,pop,push 4,pop,pop,pop,push 5,pop input 輸...

棧 出棧序列判定

給乙個初始的入棧序列,其次序即為元素的入棧次序,棧頂元素可以隨時出棧,每個元素只能入棧依次。輸入乙個入棧序列,後面依次輸入多個序列,請判斷這些序列是否為所給入棧序列合法的出棧序列。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個出棧序列,但4,3,5,1,2就...

由入棧 出棧序列求所有出棧 入棧序列

給出乙個陣列,代表入棧順序,求所有出棧可能性?給出乙個陣列,代表出棧順序,求所有入棧可能性?這兩題解法相同,可利用全排列求出所有組合,再進行可能性分析。全排列 如下 public list permute int nums 這種方法是什麼意思呢?例如abc,在第0位有三種可能,axx,bxx,cxx...