1. 栈的基本概念
栈也是一种线性表,栈中的元素具有线性关系,只不过它是一种特殊的线性表而已,也就是说,栈是一种只能在栈顶的位置进行插入和删除操作的线性表。
2. 栈的操作
图1-栈的基本操作
栈的插入操作,叫做进栈,也称为压栈。类似子弹入弹夹,栈的删除操作,叫做出栈,也有的叫做弾栈,退栈。如同弹夹中的子弹出夹。
对于栈中的a,b,c,d四个元素来说,a是最先进栈的元素,然后b,c,d依次进栈,由于d是最后进栈的,所以d元素是在栈顶,而a元素是在栈底。当出栈时,d元素在栈顶,所以d元素最先出栈,然后c,b,a依次出栈,而a元素是最后出栈的。因此我们可以发现:栈中的元素总是先进后出的。
3. 顺序栈的抽象数据类型
顺序栈的抽象数据类型定义如下
ADT Stack
{
数据对象:
D = {ai | ai∈ElemType, i=1,2,…,n, n≧0 } //ElemType为类型标识符
数据关系:
R = {<ai, ai+1> | ai, ai+1∈D, i=1,3,…,n-1 }
数据操作:
InitStack(&s):初始化栈。构造一个空栈s。
DestroyStack(&s):销毁栈。释放栈s占用的存储空间。
StackEmpty(s):判断栈是否为空:若栈s为空,则返回真;否则返回假。
Push(&S,e):进栈。将元素e插入到栈s中作为栈顶元素。
Pop(&s,&e):出栈。从栈s中退出栈顶元素,并将其值赋给e。
GetTop(s,&e):取栈顶元素。返回当前的栈顶元素,并将其值赋给e。
}
栈的顺序存储结构
栈的顺序存储结构简称顺序栈,它是运算受限制的顺序表。栈的顺序存储结构是:利用一组地址连续的存储空间依次存放自栈底到栈顶的数据元素,同时设置栈顶元素的下标top指向栈顶元素的位置。
栈的顺序存储结构:
//定义栈的顺序存储结构
typedef struct SQSTACK
{
ElemType data[MaxSize];//存储空间,ElemType为元素类型
int top; //记录栈顶元素的下标
} SqStack;
因为栈是一种特殊的线性表,所以栈的顺序存储可以通过顺序线性表来实现。
图2-顺序栈的存储实现
顺序栈4要素:
图3-顺序栈4要素
假设栈的大小以MaxSize=5为例
1 . 栈满条件:当top的下标等于MaxSize - 1时,表示栈已经存满元素了。
2 . 元素a进栈操作:先将top下标+1,将元素a放在top下标的位置
3 . 元素a出栈操作:先从top下标的位置将元素a出栈,然后top下标-1
4 . 栈空的条件:当top = -1,因为top = 0表示已经是指向栈中的最后一个元素,所以当top = -1则表示栈为空,没有元素了。