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个元素进栈,有几种出栈方式相关推荐

  1. n个元素进栈,共有多少种出栈顺序?

    1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1     //即 1 f(2) = 2     //即 12.21 f(3) = ...

  2. 元素入栈顺序确定,共有多少种出栈顺序?----Python

    文章目录 问题描述 对栈的理解 题目的思考 python代码 卡特兰数 扩展思路 问题描述 前几天看到一个题目,假设五个元素的入栈顺序为e1.e2.e3.e4.e5,那么共有多少种出栈顺序?一时之间思 ...

  3. N个数依次进栈,求所有可能的出栈方式

    import java.util.Arrays; public class N个数的出栈方式 {static int flag_count=0;public static void main(Stri ...

  4. 算法: n个元素进栈,共有多少种出栈顺序?

    1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1 //即 1f(2) = 2 //即 12.21f(3) = 5 //即 123 ...

  5. PUSH进栈指令和POP出栈指令

    PUSH进栈指令 指令格式:PUSH 源 指令功能:将源操作数推入堆栈. 源操作数可以是16位通用寄存器.段寄存器或存储器中的数据字,但不能是立即数.堆栈是以"先进后出"的方式工作 ...

  6. 问题 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 样例 ...

  7. 大话数据结构(五)——栈的两种java实现方式

    在我们生活当中经常会看到这样一种操作,比如我们往一个空羽毛球盒子里面放羽毛球(个人比较喜欢羽毛球,嘿嘿),放完后再将羽毛球一个一个取出的时候会发现,最先放进去的羽毛球往往最后才取出来,相反,最后放入的 ...

  8. 数据结构栈的操作,初始化栈,进栈,出栈,读取栈顶元素;

    代码段: #include<stdio.h> #include<stdlib.h> #include<stdbool.h> #include<string.h ...

  9. 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。...

    住栈的特性:对于取出栈内元素每次只能从栈顶开始取(后进先出(栈满时,只能先出后进)) 由于栈内只能容纳4个元素: 所以 E F不可能第一个出栈: 当栈内少于四个元素时 既可以选择进栈,也可以选择出栈 ...

最新文章

  1. 二、八、十、十六进制及小数间的转换
  2. 三角形一点到三边距离最小_高中数学:利用正弦定理、余弦定理求解三角形基础题...
  3. 中国有机玻璃市场竞争策略与投资前景建议报告2022-2028年
  4. cursor:hand与cursor:pointer的区别介绍
  5. 【译】Advanced Blockchain Concepts for Beginners
  6. MetaException(message:Hive Schema version 3.0.0 does not match metastore's schema version 1.2.0 Meta
  7. 为UIKeyboardTypeNumberPad增加自定义按键
  8. 爆笑:可怜的话剧演员
  9. .net导出为powerpoint的一些参考代码
  10. 关于元器件选型需要注意的问题
  11. xcode archive 去掉dsym文件和添加dsym文件
  12. (附源码)基于springboot平衡膳食小程序 毕业设计 250859
  13. 深圳计算机学校排名2015年,2015深圳各区初中最新排名,10各区学校都有
  14. 为什么我们看到的DataFocus可视化大屏都是深蓝色的?
  15. 我养的无名花草,四季开花
  16. 几款U盘数据恢复的软件使用测评
  17. 梦想起航商务工作PPT模板-优页文档
  18. webpack 的安装与使用
  19. OpenVINO2022.1+open_model_zoo例程的编译与使用
  20. html里列表前的空心圆圈,如何在HTML中创建带有圆圈项目符号的无序列表?

热门文章

  1. 怎样才能胜任技术总监
  2. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21
  3. 果园篱笆c语言算法,天然篱笆墙:果园栽种这几种树
  4. Web攻防--基础入门--特定漏洞
  5. mencoder的配置文件
  6. 点云配准5 -辅助知识 最小二乘法代码实现拟合曲线(C++)
  7. DataBinding快速入门(还在用findViewById?)
  8. 晨风机器人卡片/文字双切配置
  9. 关于CND与真实IP
  10. 全网页都变灰了,这是怎么实现的?