n个元素进栈,有几种出栈方式
1. 饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个地放进碗橱摞成一摞。一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式?
2. 给定n个数,有多少种出栈序列?
3. 一个有n个1和n个-1组成的字串,且前k个数的和均不小于0,那这种字串的总数为多少?
这三个问题具有相同的结构,三个问题是可以互相转化。将姐姐放碗看做入栈操作,将妹妹放碗看做出栈操作。则问题一变为问题二。将入栈操作记为1,出栈记为-1,问题2变为问题3。
问题的答案是一个著名的数列,卡特兰数。该问题的代数解法比较抽象,而运用到几何上,用图片来描述,却有让人恍然大悟的感觉。
一、递推
我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出:
f(1) = 1 //即 1
f(2) = 2 //即 12、21
f(3) = 5 //即 123、132、213、321、231
然后我们来考虑f(4), 我们给4个元素编号为a,b,c,d, 那么考虑:元素a只可能出现在1号位置,2号位置,3号位置和4号位置(很容易理解,一共就4个位置,比如abcd,元素a就在1号位置)。
分析:
1) 如果元素a在1号位置,那么只可能a进栈,马上出栈,此时还剩元素b、c、d等待操作,就是子问题f(3);
2) 如果元素a在2号位置,那么一定有一个元素比a先出栈,即有f(1)种可能顺序(只能是b),还剩c、d,即f(2), 根据乘法原理,一共的顺序个数为f(1) * f(2);
3) 如果元素a在3号位置,那么一定有两个元素比1先出栈,即有f(2)种可能顺序(只能是b、c),还剩d,即f(1),
根据乘法原理,一共的顺序个数为f(2) * f(1);
4) 如果元素a在4号位置,那么一定是a先进栈,最后出栈,那么元素b、c、d的出栈顺序即是此小问题的解,即 f(3);
结合所有情况,即f(4) = f(3) + f(2) * f(1) + f(1) * f(2) + f(3);
为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:
f(4) = f(0)*f(3) + f(1)*f(2) + f(2) * f(1) + f(3)*f(0)
然后我们推广到n,推广思路和n=4时完全一样,于是我们可以得到:
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... + f(n-1)*f(0)
即
二、通项(卡特兰数)
C(2n,n)/(n+1)
事实上,可以认为问题是,任意两种操作,要求每种操作的总次数一样,且进行第k次操作2前必须先进行至少k次操作1。我们假设一个人在原点,操作1是此人沿右上角45°走一个单位(一个单位设为根号2,这样他第一次进行操作1就刚好走到(1,1)点),操作2是此人沿右下角45°走一个单位。第k次操作2前必须先进行至少k次操作1,就是说明所走出来的折线不能跨越x轴走到y=-1这条线上!在进行n次操作1和n此操作2后,此人必将到到达(2n,0)!若无跨越x轴的限制,折线的种数将为C(2n,n),即在2n次操作中选出n次作为操作1的方法数。
现在只要减去跨越了x轴的情况数。对于任意跨越x轴的情况,必有将与y=-1相交。找出第一个与y=-1相交的点k,将k点以右的折线根据y=-1对称(即操作1与操作2互换了)。可以发现终点最终都会从(2n,0)对称到(2n,-2)。由于对称总是能进行的,且是可逆的。我们可以得出所有跨越了x轴的折线总数是与从(0,0)到(2n,-2)的折线总数。而后者的操作2比操作1要多0-(-2)=2次。即操作1为n-1,操作2为n+1。总数为C(2n,n-1)。
转载于:https://www.cnblogs.com/Xilian/p/3775750.html
n个元素进栈,有几种出栈方式相关推荐
- n个元素进栈,共有多少种出栈顺序?
1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1 //即 1 f(2) = 2 //即 12.21 f(3) = ...
- 元素入栈顺序确定,共有多少种出栈顺序?----Python
文章目录 问题描述 对栈的理解 题目的思考 python代码 卡特兰数 扩展思路 问题描述 前几天看到一个题目,假设五个元素的入栈顺序为e1.e2.e3.e4.e5,那么共有多少种出栈顺序?一时之间思 ...
- N个数依次进栈,求所有可能的出栈方式
import java.util.Arrays; public class N个数的出栈方式 {static int flag_count=0;public static void main(Stri ...
- 算法: n个元素进栈,共有多少种出栈顺序?
1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1 //即 1f(2) = 2 //即 12.21f(3) = 5 //即 123 ...
- PUSH进栈指令和POP出栈指令
PUSH进栈指令 指令格式:PUSH 源 指令功能:将源操作数推入堆栈. 源操作数可以是16位通用寄存器.段寄存器或存储器中的数据字,但不能是立即数.堆栈是以"先进后出"的方式工作 ...
- 问题 B: 不同出栈情况(栈和队列)
题目描叙: 假设有n个元素依次进栈,给出他们不同的出栈情况.输入n与元素. 输入 3 1 2 3 输出 1 2 3 1 3 2 3 2 1 2 1 3 2 3 1 样例输入 Copy 2 1 2 样例 ...
- 大话数据结构(五)——栈的两种java实现方式
在我们生活当中经常会看到这样一种操作,比如我们往一个空羽毛球盒子里面放羽毛球(个人比较喜欢羽毛球,嘿嘿),放完后再将羽毛球一个一个取出的时候会发现,最先放进去的羽毛球往往最后才取出来,相反,最后放入的 ...
- 数据结构栈的操作,初始化栈,进栈,出栈,读取栈顶元素;
代码段: #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h ...
- 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。...
住栈的特性:对于取出栈内元素每次只能从栈顶开始取(后进先出(栈满时,只能先出后进)) 由于栈内只能容纳4个元素: 所以 E F不可能第一个出栈: 当栈内少于四个元素时 既可以选择进栈,也可以选择出栈 ...
最新文章
- 二、八、十、十六进制及小数间的转换
- 三角形一点到三边距离最小_高中数学:利用正弦定理、余弦定理求解三角形基础题...
- 中国有机玻璃市场竞争策略与投资前景建议报告2022-2028年
- cursor:hand与cursor:pointer的区别介绍
- 【译】Advanced Blockchain Concepts for Beginners
- MetaException(message:Hive Schema version 3.0.0 does not match metastore's schema version 1.2.0 Meta
- 为UIKeyboardTypeNumberPad增加自定义按键
- 爆笑:可怜的话剧演员
- .net导出为powerpoint的一些参考代码
- 关于元器件选型需要注意的问题
- xcode archive 去掉dsym文件和添加dsym文件
- (附源码)基于springboot平衡膳食小程序 毕业设计 250859
- 深圳计算机学校排名2015年,2015深圳各区初中最新排名,10各区学校都有
- 为什么我们看到的DataFocus可视化大屏都是深蓝色的?
- 我养的无名花草,四季开花
- 几款U盘数据恢复的软件使用测评
- 梦想起航商务工作PPT模板-优页文档
- webpack 的安装与使用
- OpenVINO2022.1+open_model_zoo例程的编译与使用
- html里列表前的空心圆圈,如何在HTML中创建带有圆圈项目符号的无序列表?