栈Stack
逻辑结构
栈(Stack)是只允许在一端进行插入或删除操作的线性表。
重要术语:栈顶(现在能放入的一段),栈底(最早放入的元素的一段),空栈。
- 特点:后进先出(last in first out, LIFO)
逻辑结构:与普通线性表相同
数据的运算:插入、删除操作有区别
物理(存储)结构
- 顺序栈(顺序存储)
- 单项栈
- 共享栈
- 链栈(链式存储)
基本操作
InitStack(&S):初始化栈。构造一个空栈S,分配内存空间。
DestroyStack(&L):销毁栈。销毁并释放栈 S 所占用的内存空间。
Push(&S,x):插入,进栈。若栈S未满,则将x加入使之成为新栈顶。
Pop(&S,&x):删除,出栈。若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S,&x):读取栈顶元素。若栈S非空,则用x返回线顶元素。
其他常用操作:
StackEmpty(S):判断一个栈S是否为空。若S为空,则返回true,否则返回false。
常考题型
进栈顺序:a->b->c->d->e
有哪些合法的出栈顺序?
全部进入后出栈:e->d->c->b->a(倒序)
进出栈穿插进行:
a->b->c->d->e(进一个出一个)
卡特兰(Catalan)数:n个不同元素进栈,出栈元素不同排列的个数为
1
n
+
1
C
2
n
n
\frac 1{n+1}C_{2n}^n
n+11C2nn
。上述公式称为卡特兰(Catalan)数,可采用数学归纳法证明(不要求掌握)。
所以,abcde 5个元素,有
1
5
+
1
C
10
5
=
1
6
∗
10
∗
9
∗
8
∗
7
∗
6
5
∗
4
∗
3
∗
2
∗
1
=
42
\frac 1{5+1}C_{10}^5=\frac1{6}*\frac{10*9*8*7*6}{5*4*3*2*1}=42
5+11C105=61∗5∗4∗3∗2∗110∗9∗8∗7∗6=42
种出栈可能。