栈的抽象数据类型
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)= 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,...)
还是自己学识太浅薄,关于卡特兰数的应用以后补上~