分析方法1
記f(n)為出棧序列種數。設從第一個數入棧到第一次棧為空的出棧數為是k。特別地,如果棧直到整個過程結束時才空,則k=n 。
首次出空之前第一個出棧的序數k將1~n的序列分成兩個序列,其中一個是1~k-1,序列個數為k-1,另外一個是k+1~n,序列個數是n-k。 此時,我們若把k視為確定一個序數,那么根據乘法原理,f(n)的問題就等價於——序列個數為k-1的出棧序列種數乘以序列個數為n - k的出棧序列種數,即選擇k這個序數的f(n)=f(k-1)×f(n-k)。而k可以選1到n,所以再根據加法原理,將k取不同值的序列種數相加,得到的總序列種數為:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0),其中f(0)=1,f(1)=1。
這與卡特蘭數的遞推式一致, f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)
分析方法2
對於每一個數來說,必須進棧一次、出棧一次。把進棧設為狀態'1',出棧設為狀態'0'。n個數的所有狀態對應n個1和n個0組成的2n位二進制數。
由於等待入棧的操作數按照1‥n的順序排列、入棧的操作數b大於等於出棧的操作數a(a≤b),因此輸出序列的總數目=由左而右掃描由n個1和n個0組成的2n位
二進制數,1的累計數不小於0的累計數的方案種數。 在2n位二進制數中填入n個1的方案數為c(2n,n),不填1的其余n位自動填0。從中減去不符合要求(由左而右掃描,0的累計數大於1的累計數)的方案數即為所求。得到相同的結論