mirror of
https://github.com/happyflyer/wangdao-data-structure.git
synced 2026-05-01 06:01:41 +08:00
栈和队列
三要素:
- 逻辑结构
- 数据的运算
- 存储结构(物理结构)
1. 栈
1.1. 定义
栈是只允许在一端进行插入或删除操作的线性表。
- 栈顶:允许插入和删除的一端。
- 栈底:不允许插入和删除的一端。
- 空栈
- 栈顶元素
- 栈底元素
进栈顺序:
a_1->a_2->a_3->a_4->a_5
出栈顺序:
a_5->a_4->a_3->a_2->a_1
后进先出,Last In First OUT(LIFO)
1.2. 基本操作
InitStack(&S):初始化栈。构造一个空栈 $S$,分配内存空间。DestroyStack(&S):销毁栈。销毁并释放栈S所占用的内存空间。Push(&S, x):进栈。若栈S未满,则将x加入使之成为新栈顶。Pop(&S, &x):出战,若栈S非空,则弹出栈顶元素,并用x返回。GetTop(S, &x):读栈顶元素。若栈S非空,则用x返回栈顶元素。StackEmpty(S):判断一个栈S是否为空。若S为空,则返回true,否则返回false。
n 个不同的元素进栈,出栈元素的不同排列的个数为:
\frac{1}{n+1} C^{n}_{2n}
上述公式称为 卡特兰(Catalan)数。可采用数学归纳法证明(不要求掌握)。
\frac{1}{5+1} C^{5}_{10}
=\frac{10*9*8*7*6}{6*5*4*3*2*1}
=42
1.3. 顺序栈
顺序存储,用静态数据实现,并需要记录栈顶指针。
基本操作
- 初始化(创)
- 进栈(增)
- 出栈(删)
- 获取栈顶元素(查询)
两种实现
- 初始化时
top=-1 - 初始化时
top=0
共享栈
- 两个栈共享同一片内存空间,两个栈从两边往中间增长。
- 初始化:
S.top0 = -1;,S.top1 = MaxSize;。 - 栈满条件:
S.top0 + 1 == S.top1;