1 定义
栈是限定只能在表尾删除和插入操作的线性表。
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
栈的插入操作称为进栈,也称压栈、入栈。
栈的删除操作称为出栈,也称弹栈。
2 栈的抽象数据结构
由于栈本身就是一个线性表,所以线性表的操作特性它都具备,针对它的特殊性,在它的操作上可能会有一些变化。将进栈和出栈分别改名为push和pop。
由于栈本身是一个线性表,所以线性表的顺序存储结构和链式存储结构同样适用于栈。
3 栈的顺序存储结构
用顺序存储结构存储的栈称为顺序栈。线性表是用数组来实现的。对于栈,用下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化比较小。
我们定义一个top变量来指示栈定元素在数组中的位置。若存储栈的长度为StackSize,则栈顶位置top必需小于StackSize。当栈存在一个元素时,top等于0,因此空栈的判断条件为top等于-1.
栈的结构定义
typedef int SElemType; typedef struct { SElemType data[MAXSIZE]; int top; //用于栈顶指针 } SqStack;
若现在有一个栈,StackSize为5,则普通栈、空栈、满栈的情况如下图所示。
4 进栈
对于栈的插入,即进栈操作,其实就是做了如下处理。
Status Push(SqStack *s, SElemType e) { if (s->top == MAXSIZE - 1) { //栈满 return ERROR; } s->top ++; //栈顶指针加1 s->data[s->top] = e; //将新元素赋值给栈顶空间 return OK; }
5 出栈
Status Pop(SqStack *s, SElemType *e) { if (s->top == -1) { //空栈 return ERROR; } *e = s->data[s->top]; //将要删除的栈顶元素赋值给e s->top --; //栈顶指针减1 return OK; }