出栈序列总数的理解思路
出栈序列总数
在栈这个数据结构中有一个结论:对于n个不同的元素进栈,将出栈顺序记录为一组元素序列,那么总共会有 1 n + 1 C 2 n n \frac{1}{n+1}C_{2n}^{n} n+11C2nn个不同的出栈顺序的元素序列。
这个结论的通俗理解(记忆)思路
借助平面几何的方法可以很好地理解、记忆、计算。首先n个元素进栈再出栈总共是2n个执行步骤,每个步骤看做直角坐标系上x轴的一个整数单位点。这2n个执行步骤无非就是两种:进栈、出栈,于是将这两种操作分别表示为y轴中的向上一格和向下一格。
显然,n个元素进栈和出栈这2n个操作其实就是向上走n格,和向下走n格,最终肯定会落在x轴上,即(2n,0)点。考虑选取2n步骤中的n步的组合数,可以知道总共可能存在
C
2
n
n
C_{2n}^{n}
C2nn这么多种折线段。
但是单纯这样不能保证随意的折线段是合法的出栈序列。现实中栈为空的时候不能再有元素出栈了,所以合法的出栈序列要保证在出栈时栈非空,在坐标系中体现为折线不能向下突破x轴,即当折线中节点在x轴上时,栈是空的,不能再出栈(向右下前进)。
那么所有情况的种数减去非法的情况数就得到了,出栈元素序列总是。
所以非法的情况数如何求呢?
非法的情况即上图中的C点,有一个巧妙的思路计算这种非法的情况数:将C点之后的折线段沿着y=-1翻折,发现这样会导致终点(E点)由原本落在x轴上变为落在了y=-1这条水平直线上。
此时纵观全图发现从起点(A点)到终点经过了n-1步向上,n+1步向下,于是这种情况数量应该有 C 2 n n − 1 C_{2n}^{n-1} C2nn−1种。
于是栈中出栈元素序列的总数这个问题的最终答案即为 C 2 n n − 1 − C 2 n n C_{2n}^{n-1}-C_{2n}^{n} C2nn−1−C2nn,根据我们高中排列组合中学过的, C 2 n n − 1 = n + 2 n + 1 C 2 n n C_{2n}^{n-1}=\frac{n+2}{n+1}C_{2n}^{n} C2nn−1=n+1n+2C2nn可以得到课本上的 1 n + 1 C 2 n n \frac{1}{n+1}C_{2n}^{n} n+11C2nn这个结果
参考
https://blog.csdn.net/qq_30115697/article/details/88906534
感谢作者的思路,对我理解帮助非常大!