栈(stack)的抽象数据类型及进栈出栈次序

栈的抽象数据类型


ADT 栈 (stack)

Data

       同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。

Operation
      
       InitStack(*s):初始化操作,建立一个空栈S.
       DestroyStack(*S):若栈存在,则销毁它
       ClearStack(*S):将栈清空
       StackEmpty(S):若栈为空,返回true,否则返回false
       GetTop(S,*e):若栈存在且非空,用e返回S的栈顶元素
       Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素
       Pop(*s,*e):删除栈S中栈顶元素,并用e返回其值
       StackLength(S):返回栈S的元素个数



进栈出栈次序

最先进栈的元素,不一定是最后出栈的。栈对线性表的插入和删除的位置进行了限制,并没有对元素进出的具体时间进行限制,也就是说,在不是所有元素都进栈的情况下,事先进去的元素也可以出栈,只要保证是当时的栈顶元素即可。


例如:现在有3个整型数字元素1、2、3依次进栈,会有哪些出栈顺序?

① 1,2,3进,3,2,1出,出栈次序为321;

②1进1出 2进2出 3进3出 出栈次序为123;

③1进,2进,2出,1出,3进,3出,出栈次序为213;

④1进,1出,2进,3进,3出,2出,出栈次序为132;

⑤ 1进,2进,2出,3进,3出,1出 出栈次序为231;

可以看到,不会有312这样的次序。因为3先出栈,1和2已经进栈了,2在1的上面,那么出栈只可能是321,不然不满足123依次进栈的要求,所以此时不会发生1比2先出栈的情况。


n个元素依次进栈,出栈次序 种数的公式:

(1/n+1)*C(2n,n)


关于这个式子,最近才发现来头很大,这个式子是卡特兰数Catalan number)递推式的解:

令h(0)=1,h(1)=1,catalan数满足递推式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

也可写成:
h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=0,1,2,...)

递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)

还是自己学识太浅薄,关于卡特兰数的应用以后补上~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值