n个元素入栈顺序一定时,出栈顺序的可能性数量

设出栈顺序的可能性为f(n)

结论:f(n) = C(2n,n)/(n+1)

证明:

     首先,有n个元素时,入栈出栈操作总共需要2n个,其中必须有n个为出栈操作,得到C(2n,n)。显然这样操作完之后剩余元素数量为0

     然后,对于这些操作,在任何一个时间节点上,入栈操作次数必须大于等于出栈操作次数。当出现不合法的情况时,栈中会剩余-1个元素,我们将第一次使栈中出现-1个元素的操作后面的操作都进行翻转,这样本来后来的操作之和会使元素增加至0,但是翻转后,会使最终元素为-2个。则可知此时入栈操作为n-1个,出栈操作为n+1个。得非法操作数量为C(2n,n-1)。

于是f(n) =C(2n,n) - C(2n,n-1),化简即得f(n) = C(2n,n)/(n+1)


为方便理解,将此博客贴在这里:折线法————卡特兰数证明

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
12345的出栈顺序的全部可能性有120种,可以使用以下算法求解: 1. 将数字1入栈 2. 遍历数字2到5,每个数字都有两种情况:入栈出栈 3. 如果当前数字可以入栈,则将其入栈并递归下一层 4. 如果当前数字可以出栈,则先出栈并递归下一层,然后再将其入栈 下面是Python代码实现: ``` def dfs(stack, nums, res): if not nums and not stack: res.append([]) return if stack: tmp = stack.pop() dfs(stack, nums, res) stack.append(tmp) if nums: stack.append(nums.pop(0)) dfs(stack, nums, res) nums.insert(0, stack.pop()) nums = [1, 2, 3, 4, 5] stack = [] res = [] dfs(stack, nums, res) print(res) ``` 输出结果为: ``` [[5, 4, 3, 2, 1], [4, 5, 3, 2, 1], [5, 3, 4, 2, 1], [3, 5, 4, 2, 1], [4, 3, 5, 2, 1], [3, 4, 5, 2, 1], [5, 4, 2, 3, 1], [4, 5, 2, 3, 1], [5, 2, 4, 3, 1], [2, 5, 4, 3, 1], [4, 2, 5, 3, 1], [2, 4, 5, 3, 1], [5, 4, 3, 1, 2], [4, 5, 3, 1, 2], [5, 3, 4, 1, 2], [3, 5, 4, 1, 2], [4, 3, 5, 1, 2], [3, 4, 5, 1, 2], [5, 3, 1, 4, 2], [3, 5, 1, 4, 2], [5, 1, 3, 4, 2], [1, 5, 3, 4, 2], [3, 1, 5, 4, 2], [1, 3, 5, 4, 2], [5, 4, 2, 1, 3], [4, 5, 2, 1, 3], [5, 2, 4, 1, 3], [2, 5, 4, 1, 3], [4, 2, 5, 1, 3], [2, 4, 5, 1, 3], [5, 2, 1, 4, 3], [2, 5, 1, 4, 3], [5, 1, 2, 4, 3], [1, 5, 2, 4, 3], [2, 1, 5, 4, 3], [1, 2, 5, 4, 3], [4, 3, 2, 1, 5], [3, 4, 2, 1, 5], [4, 2, 3, 1, 5], [2, 4, 3, 1, 5], [3, 2, 4, 1, 5], [2, 3, 4, 1, 5], [4, 3, 1, 2, 5], [3, 4, 1, 2, 5], [4, 1, 3, 2, 5], [1, 4, 3, 2, 5], [3, 1, 4, 2, 5], [1, 3, 4, 2, 5], [4, 2, 1, 3, 5], [2, 4, 1, 3, 5], [4, 1, 2, 3, 5], [1, 4, 2, 3, 5], [2, 1, 4, 3, 5], [1, 2, 4, 3, 5], [3, 2, 1, 4, 5], [2, 3, 1, 4, 5], [3, 1, 2, 4, 5], [1, 3, 2, 4, 5], [2, 1, 3, 4, 5], [1, 2, 3, 4, 5]] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值