参考了多篇博客之后,终于弄懂了,写下了方便以后复习!首先简单介绍一下堆栈的运行方式,先入后出,First In Last Out(FILO),即若我们将1-4顺序放入堆栈中,则出栈顺序为4 3 2 1。了解堆栈的出栈顺序后,接下来介绍一下若将1-n顺序放入堆栈中,可能的出栈情况个数。本文将介绍两种方法,第一种通过01字符串考虑,第二种通过利用组合数学,考虑数字1的出栈所在位置进行分析。

01字符串

考虑以下的情况:
  *
  * *
  * * *
  * * * *
  上述的三角形方针表示只能向下走或向右走,(向下走表示入栈,向右走表示出栈),那上述的三角形方针就表示123可能的出栈顺序。下面的图就表示出栈顺序为231。

  如果用1表示入栈,0表示出栈,则1-n的入栈与出栈顺序就可由2n个01字符串表示。那所有情况就是C(n,2n),当然里面包含许多不满足堆栈实际情况的出入栈顺序。
  由上述三角形方针可知,如果出栈个数多于入栈个数的话是不可能存在的情况,我们上述举的例子出栈顺序为231的话,整体用01表示为110100(1入栈,2入栈,2出栈,3入栈,3出栈,1出栈),那假设01串为100110的话肯定是不可能的,入栈才1个数,出栈就两个数了,通过这个例子可以明白为何出栈个数多于入栈个数的话是不可能存在的,即0的个数大于1的个数。下面来分析这种不满足情况的有多少种:
  已知整个01数字串中包含n个0,n个1。在第一次出现0的个数比1的个数多时,假设1出现了k次,0出现了k+1次,则之后的01序列中1的个数为n-k,0的个数为n-k-1,若将后半部分的0换成1,1替换成0,则总体的数字串包含1有k+n-k-1=n-1个,同理0的个数有n+1个。那就可以求出来不满足情况的有C(n+1,2n)个。

  因此,若将1-n顺序放入堆栈中,共有情况C(n,2n)-C(n+1,2n)种。

利用组合数学

  假设数字1在出栈顺序中占第k位(从第一位开始),则数字1之前包含k-1个数字,1之后包含n-k个数字,且数字1之前出现的数字一定为2-k,数字1之后出现的数字为k+1到n。如图所示:

  数字1入栈后,数字2-k以某种顺序入栈并出栈,之后数字1出栈,(满足假设在第k位出栈),之后数字k+1到n以某种顺序入栈并出栈。数字2-k以某种顺序入栈并出栈的情况种数为f(k-1),数字k+1到n以某种顺序入栈并出栈的情况种数为f(n-k),因此由乘法原理可知,数字1在第k位出栈的情况种数为f(k-1)·f(n-k)
  数字1又可能出现在第1位,第2位,第3位,…,第k位,…,第n位。

  • 出现在第1位的情况总数为f(0)·f(n-1)
  • 出现在第2位的情况总数为f(1)·f(n-2)
  • 出现在第3位的情况总数为f(2)·f(n-3)
  • 出现在第k位的情况总数为f(k-1)·f(n-k);
  • 出现在第n位的情况总数为f(n-1)·f(0);

因此总的可能个数为f(0)·f(n-1)+f(1)·f(n-2)+f(2)·f(n-3)+…+f(k-1)·f(n-k)+f(n-1)·f(0)。这个就是卡兰特数了,最后结果f(n) = C(n,2n)-C(n+1,2n)

堆栈出栈顺序个数详解——卡兰特数相关推荐

  1. N个数的所有出栈顺序

    #include<iostream> #include<algorithm> using namespace std;void clean_0(int visited[]) { ...

  2. C/C++堆、栈及静态数据区详解

    五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面 ...

  3. 堆、栈及静态数据区详解

    堆.栈及静态数据区详解 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储 ...

  4. python实例化是什么意思_Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

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

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

  6. Oracle SQL语句执行流程与顺序原理详解

    以前读的文章,保存到本地了,忘记来源了,分享一下,本地存着怕丢了 Oracle SQL语句执行流程与顺序原理详解 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条S ...

  7. 出栈顺序问题讲解 蓝桥杯

    引言:最近刷数据结构的题,刷到一组元素入栈,他的出栈顺序有可能是哪些时卡住,之前没有关注此类问题,便写下总结 先通过几个例题讲解下出栈顺序问题 1. 一个栈的入栈序列是a,b,c,d,e则栈的不可能的 ...

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

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

  9. (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解

    转: https://www.cnblogs.com/Jeely/p/10762152.html web.xml 中的listener. filter.servlet 加载顺序及其详解 一.概述 1. ...

最新文章

  1. IOS类似9.png
  2. 华为服务器MLC硬盘ID号,RH2288H RH5885H V3 3.5寸 SAS SATA华为服务器硬盘架子 支架
  3. 如何打造智能化的员工出行方式?阿里自研出行神器首次曝光
  4. 关于一个Panel上鼠标不及时响应MouseLeave事件
  5. eclipse环境lsp4e --- org.eclipse.lsp4e
  6. Blocking/Non-Blocking VS Sync/Async VS Overlapped
  7. datatable java实现_在JAVA实现DataTable对象(一)
  8. pycharm主题、颜色、字体设置
  9. 你可以有喜欢和善用的语言,但千万不要和她Bind
  10. 数学建模之传染病SIR模型(新冠真实数据)
  11. 图像检索:颜色聚合向量(CCV)及matlab实现
  12. wifi WPS功能介绍
  13. MyEclipse编辑区设置为黑底
  14. 【调剂】河北农业大学2020年硕士研究生招生调剂工作办法
  15. 谷歌文件系统GFS理解
  16. JAVA java学习(9)——————java常用开发工具介绍
  17. 哨兵2a 波段组合_基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取
  18. 中国式危机公关9加1策略(第七章 道歉先行策略)
  19. 张勋说:棒磨机钢棒技术标准应怎样确定(图文)
  20. 常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

热门文章

  1. 河南大学计算机与信息工程学院保研,超颜值!河南大学5位超级学霸,全部保送985研究生...
  2. 京东爬虫,包括数据绘图(python基于Anaconda3的Spyder开发)
  3. Vue页面嵌入其他页面
  4. Java操作Redis存储HashMap对象类型数据
  5. U盘非物理损坏如何修复
  6. openlayes3在地图上画点线
  7. HPAIC人类蛋白质图谱分类挑战赛金牌经验分享 1
  8. 领导力开发策略-360度测评
  9. android xposed 简书,Xposed开发插件环境配置
  10. 八爪鱼南都行|人工智能助力智能门锁行业研究