3.1 栈 ( Stack )
1. 定义:限定只在表的一端( ( 表尾) ) 进行插入和删除操作的线性表
特点: 后进先出( ( LIFO)
允许插入和删除的一端称为 栈顶 top,另一端称为 栈底 bottom
2. 栈的表示和实现
1)顺序栈——栈的顺序存储结构
限定在表尾进行插入和删除操作的顺序表
类型定义:
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
} SqStack;
SqStack s;
说明:
- base称为栈底指针,始终指向栈底;
当base = NULL时,表明栈结构不存在。
- top为栈顶指针
a. top的初始值指向栈底,即top=base
b. 空栈:当top=base时为栈空的标记
c. 当栈非空时,top的位置:指向当前栈顶元素的下一个位置
- stacksize ——当前栈可使用的最大容量
进栈示例
退栈示例
几点说明:
- 栈空条件:s. top =s. base 此时不能出栈
- 栈满条件:s.top-s.base>=s.stacksize
- 进栈操作:*s.top++=e; 或*s.top=e; s.top++;
- 退栈操作:e=*--s.top; 或s.top--; e=*s.top;
- 当栈满时再做进栈运算必定产生空间溢出,简称“上溢”;
- 当栈空时再做退栈运算也将产生溢出,简称“下溢”。
基本操作的实现
- 栈的初始化操作 Status InitStack(SqStack &S)
- 取栈顶元素 Status GetTop(SqStack S, SElemType &e)
- 进栈操作 Status Push(SqStack &S, SElemType e)
- 退栈操作 Status Pop(SqStack &S, SElemType &e)
2)链栈——栈的链式存储结构
- 不带头结点的单链表,其插入和删除操作仅限制在表头位置上进行。链表的头指针即栈顶指针。
- 类型定义:
typedef struct SNode{
SElemType data;
struct SNode *next;
}SNode, *LinkStack;
LinkStack s;
- 链栈示意图
- 栈空条件: s=NULL
- 栈满条件: 无 / 无Free Memory可申请