进栈序列为(1,2,3..,n)有多少种出栈顺序

分析方法1

记f(n)为出栈序列种数。设从第一个数入栈第一次栈为空的出栈数为是k。特别地,如果栈直到整个过程结束时才空,则k=n 。

首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。 此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0),其中f(0)=1,f(1)=1。

这与卡特兰数的递推式一致, f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)

分析方法2

对于每一个数来说,必须进栈一次、出栈一次。把进栈设为状态‘1‘,出栈设为状态‘0‘。n个数的所有状态对应n个1和n个0组成的2n位二进制数。

由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位

二进制数,1的累计数不小于0的累计数的方案种数。 在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。得到相同的结论

时间: 2024-10-03 14:38:45

进栈序列为(1,2,3..,n)有多少种出栈顺序的相关文章

n个元素的入栈顺序有多少种出栈顺序?

问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的分析过程如下: n个数据依次入栈,出栈顺序种数的递推公式如下:F(n)=∑(F(n-1-k)*Fk);其中k从0到n-1 已知F0=1,F1=F0*F0=1F2=F1*F0+F0*F1=2F3=F2*F0+F1*F1+F0*F2=5F4=F3*F0+F2*F1+F1*F2+F0*F3=14F5=F4

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

原文:http://blog.csdn.net/zyearn/article/details/7758716 近日在复习数据结构,看到栈的时候,发现1个元素进栈,有1种出栈顺序:2个元素进栈,有2种出栈顺序:3个元素进栈,有5种出栈顺序,那么一个很自然地问题就是n个元素进栈,共有多少种出栈顺序? 说来惭愧,以前学数据结构的时候竟然没有考虑过这个问题.最近在看动态规划,所以“子问题”这3个字一直在我脑中徘徊,于是解决这个问题的时候我也是用类似“子问题”的方法,说白了就是递推公式. 我们把n个元素的

n个元素进栈,有几种出栈方式

1. 饭后,姐姐洗碗,妹妹把姐姐洗过的碗一个一个地放进碗橱摞成一摞.一共有n个不同的碗,洗前也是摞成一摞的,也许因为小妹贪玩而使碗拿进碗橱不及时,姐姐则把洗过的碗摞在旁边,问:小妹摞起的碗有多少种可能的方式? 2. 给定n个数,有多少种出栈序列? 3. 一个有n个1和n个-1组成的字串,且前k个数的和均不小于0,那这种字串的总数为多少? 这三个问题具有相同的结构,三个问题是可以互相转化.将姐姐放碗看做入栈操作,将妹妹放碗看做出栈操作.则问题一变为问题二.将入栈操作记为1,出栈记为-1,问题2变为

N个数依次入栈,出栈顺序有多少种?

对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数. 在2n位二进制数中填入n个1的方案数为C(2n,n),不填1的其余n位自动填0.从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所

判断出栈顺序是否正确(栈的压入、弹出序列)

输入两个整数序列.其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序.为了简单起见,我们假设push序列的任意两个整数都是不相等的. 比如输入的push序列是1.2.3.4.5,那么4.5.3.2.1就有可能是一个pop系列.因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4.5.3.2.1.但序列4.3.5.1.2就不可能是push序列1.2.3

栈的出栈序列个数

有n个数$1,2,3,4,...n$依次入栈,不必等全部的数入完再出,问有多少个出栈顺序? 解: 设问题答案是$f(n)$ ,$f(1)=1,f(2)=2$ 分n种情况: 1最后出来: $ f(n)$ k最后出来:$f(k-1)*f(n-k)$ 所以  $$f(n+1)=f(n)+f(n-1)f(1)+f(n-2)f(2)+......f(k)f(n-k)+......f(n)$$ 这是Catalan数的递推式: 得$$f(n)=\frac{C^{n}_{2n}}{n+1}$$ 原文地址:htt

生成所有的出栈序列 (回溯法)

给定一个入栈序列,找出所有可能的出栈序列. 如入栈序列为 [1, 2, 3] 则可能的出栈序列为 : [ 3 2 1 ] [ 2 3 1 ] [ 2 1 3 ] [ 1 3 2 ] [ 1 2 3 ] 采用回溯法和递归统计所有可能的出栈序列. 当所有的入栈序列已经全部入栈后,则只能出栈 当栈为空时,只能进栈 当仍有入栈元素且栈不为空时,可以入栈,也可以出栈 入栈 -> 递归处理下一个入栈元素 -> 恢复未入栈状态 出栈 -> 将出栈元素添加到出栈序列 -> 递归处理下一个入栈元素

栈与队列问题1——出栈序列

问题描述:栈是常用的一种数据结构,有n个元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列.你已经知道栈的操作有两种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出.现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列.请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数. 分析:之前就有看过这种问题.就是火车进站问题,判断序列是否合法,当时是用STL栈做的.这个题只需统计次数,那么,方法就十分简便了,递归和动归都可以实现,当然

进栈出栈的合法性检查

栈与进栈出栈 栈:是限定在栈表尾进行插入或删除的线性表,又称为后进先出(LIFO)的线性表,这个特点可以形象的表示为--(铁路调度站) 只要保证每次在栈顶操作,同一进栈顺序可以有不同的出栈顺序,以下是部分出栈顺序 34521   25431  14532 32145    43215 那么究竟怎样验证一个出栈序列与一个入栈序列匹配? 思路:将进栈和出栈序列分别存在数组里,然后再创建一个辅助栈,把输入序列中的元素依次压入栈中,并按照出栈序列依次弹出. 将进栈和出栈序列存在两个数组里,然后再创建一个