一 栈的定义
栈是允许在一端进行插入或者删除操作的线性表。它是一种线性表,但是限定这种线性表只能在某一端进行插入和删除操作。
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Botton):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
二 栈结构的解析
假设某个栈S={a1,a2,a3,a4,a5},如图,a1为栈底元素,a5为栈顶元素。由于栈只能从栈顶进行插入和删除操作,进栈次序依次为a1,a2,a3,a4,a5。而出栈的次序为a5,a4,a3,a2,a1。由此可见,栈的操作特性可以明显地概况为后进先出(Last In First Out,LIFO)。
注意:我们每接触到一种新的数据结构类型,都应该分别从其逻辑结构,存储结构和对数据的运算三个方面着手。当然这也是数据结构的三要素。
三 栈的数学性质
当n个不同元素进栈,出栈元素不同排列的个数为C(n,2n)/(n+1)。该数被称为卡特兰(Catalan)数。
卡特兰数的运算(排列组合):C(n,2n)/(n+1) =(2n)!/[(n+1)!(2n-n)!]
四 栈的基本操作
- InitStack(&S):初始化一个空栈S。
- StackEmpty(S):对一个栈进行判空。
- Push(&S,x):进栈,数据进栈之前应该先对栈进行判满。在栈未满的时候,使得x成为栈顶元素。
- Pop(&S,&x):出栈,数据出栈之前应该先对栈进行判空。若栈为非空的时候,则用x返回栈顶元素。
- GetTop(S,&x):读栈元素,若栈S非空,则用x返回栈顶元素。
- DestroyStack(&S):销毁栈,并释放栈S占用的存储空间(“&”表示引用调用)。