声明:本博客仅为本人学习途中做的笔记 采自青岛大学王卓老师的视频教学 主要内容为算法思路,具体代码实现还需修改后才能运行,望各位看官多多包涵,您的点赞与评论是对我最大的肯定!
1.栈和队列的定义和特点
栈和队列是两种常用的、重要的数据结构
栈和队列是限定插入和删除只能在表的"端点"进行的线性表
栈和队列是线性表的子集(是插入和删除位置受限的线性表)
由于栈的操作具有后进先出的固有特性,使得栈成为程序设计中的有用工具。另外,如果问题求解的过程具有"后进先出"的天然特性的话,则求解的算法中也必然需要利用"栈".
- 数制转换
- 括号匹配的检验
- 行编辑程序
- 迷宫求解
- 表达式求值
- 八皇后问题
- 函数调用
- 递归调用的实现
线性表 | 栈 | 队列(先进先出) |
---|---|---|
Insert(L,i,x) 1<=i<=n+1 | Insert(S,n+1,x) | Insert(Q,n+1,x) |
Delete(L,i)1<=i<=n | Delete(S,n) | Delete(Q,1) |
栈是一个特殊的线性表,是限定仅在一端(通常是表尾)进行插入和删除操作的线性表。又称为后进先出的线性表
表尾a n _n n端称为栈顶,表头a 1 _1 1端称为栈底Base
插入元素到栈顶(即表尾)的操作,称为入栈。
从栈顶(即表尾)删除最后一个元素的操作,称为出栈。
队列是一种先进先出的线性表,在表一端插入,在另一端删除
2.栈的表示和操作的实现
由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式
栈的顺序存储–顺序栈
栈的链式存储–链栈
顺序栈的表示和实现
存储方式:同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址端
附设top指针,指示栈顶元素在顺序栈中的位置
另设base指针,指示栈底元素在顺序栈中的位置
但是,为了方便操作,通常top指针指示真正的栈顶元素之上的下标地址
另外,用Stacksize表示栈可使用的最大容量
空栈:base == top是栈空标志
栈满:top-base == stacksize
栈满时的处理方法:
1.报错,返回操作系统
2.分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈
使用数组作为顺序栈存储方式的特点:
简单、方便、但易产生溢出(数组长度固定)
上溢(overflow):栈已经满,又要压入元素
下溢(underflow):栈已经空,还要弹出元素
#define MAXSIZE 100
typedef struct{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用最大容量
}SqStack;
顺序栈的表示和实现
Status InitStack(SqStack &S){
//构造一个空栈
S.base = new SElemType[MAXSIZE];
//或S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top = S.base;//栈顶指针等于栈底指针
S.stacksize = MAXSIZE;
return OK;
}
顺序栈判断栈是否为空
Status StackEmpty(SqStack S){
//若栈为空,返回TRUE;否则返回FALSE
if(S.top == S.base)
return TRUE;
else
return FALSE;
}
求顺序栈长度
int StackLength(SqStack S){
<