进栈序列为(1,2,3..,n)有多少种出栈顺序

分析方法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的累计数)的方案数即为所求。得到相同的结论

原文地址:https://www.cnblogs.com/uangjianghui/p/7804178.html