栈的相关概念
栈(stack)是限定仅在表尾进行插入和删除操作的线性表
允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。
栈也被称为后进先出(Last In First Out)的线性表,LIFO结构
栈的插入操作(进栈),也称压栈、入栈PUSH
栈的删除操作(出栈),也称弹栈POP
进栈出栈变化
进出栈理解,假设右1,2,3依次入栈,能有哪些出栈形式
- 321:123进,321出
- 123:1进1出,2进2出,3进3出
- 213:12进,21出,3进3出
- 132:1进1出,23进,32出
- 231:12进,2出,3进,31出
栈的抽象数据类型
ADT stack
Data
同线性表
Operation
InitStack(*S):初始化操作,建立一个空栈S
DestoryStack(*S):栈存在,则销毁
ClearStack(*S):清空栈
StackEmpty(S):若栈空,返回true,否则返回false
GetTop(*S,*e):若栈存在且非空,用e返回S的栈顶元素
Push(*S,*e):若栈存在,插入新元素到栈S并成为栈顶元素
Pop(*S,*e):删除S中栈顶元素,并用e返回其值
StackLength(S):返回栈S的元素个数
endADT
栈的顺序存储结构及实现
类比游标卡尺:分配的空间是游标卡尺长度,游标即为栈顶,不动端为栈底,游标移动范围定小于游标咔嚓长度
- 栈的顺序存储也是线性表顺序存储的简化,简称为顺序栈
- 数组中,用下标为0的一端作为栈底,因为首元素都存在栈底,变化小
- 栈顶top:若存储栈长度为StackSize,则top必须小于StackSize
- 空栈:栈中有一个元素时top=0,以示区别,空栈的判定条件设为top=-1
/* 存储空间初始分配量 */
#define MAXSIZE 20
/* SElemType类型根据实际情况而定,这里假设为int */
typedef int SElemType;
/* 顺序栈结构 */
typedef struct
{
SElemType data[MAXSIZE];
int top; /* 用于栈顶指针 */
}SqStack;
假设一个栈,StackSize为5,则栈普通情况、空栈和栈满的情况
顺序存储结构初始化、进栈、出栈操作
顺序存储结构初始化操作代码描述
/* 构造一个空栈S */
Status InitStack(LinkStack *S)
{
S->top = (LinkStackPtr)malloc(sizeof(StackNode));
if(!S->top)
return ERROR;
S->top=NULL;
S->count=0;
return OK;
}
顺序存储结构进栈操作代码描述
/* 插入元素e为新的栈顶元素 */
Status Push(SqStack *S,SElemType e)
{
if(S->top == MAXSIZE -1) /* 栈满 */
return ERROR;
*e=S->data[S->top];
S->top--;
return OK;
}
顺序存储结构出栈操作代码描述
顺序存储结构出栈思路
- 首先设定一个工作结点 p,并且将栈顶结点赋值给它。
- 然后将栈顶指针下移一位,指向下一结点。代码表示为 S->top=S->top->next;
- 最后把结点 p free掉,count自减1,完成。
/* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
Status Pop(LinkStack *S,SElemType *e