目录
3.1栈和队列的定义和特点
3.2栈的表示和操作的实现
顺序栈的表示和实现
Ⅰ.顺序栈的初始化
Ⅱ.顺序栈的入栈
Ⅲ.顺序栈的出栈
链栈的表示和实现
Ⅰ.链栈的初始化
Ⅱ.链栈的入栈
Ⅲ.链栈的出栈
Ⅳ.取栈顶元素
Ⅴ.判断链栈是否为空
3.3栈与递归
3.4队列的表示和操作的实现
顺序队列
Ⅰ.循环队列的初始化
编辑 Ⅱ.循环队列的长度
Ⅲ.循环队列的入队
Ⅳ.循环队列的出队
Ⅴ.取队头元素
链式队列
Ⅰ.链队列的初始化
Ⅱ.链队列的销毁
Ⅲ.链队列的入队
Ⅳ.链队列的出队
Ⅴ.取队头元素
3.1栈和队列的定义和特点
栈:限定仅在表尾进行插入或删除操作的线性表(后进先出)
栈顶:表尾端(Top)
栈底:表头端(Base) 一般在低地址端
(栈中将允许操作的一端称为栈顶,不允许操作的一端称为栈底)
设top、base指针,指示栈顶/栈底元素在顺序栈中位置
(为了方便操作,通常top指示真正的栈顶元素之上的下标地址)
队列:限定仅在表尾进行插入且仅能在表头删除元素的线性表(先进先出)
两者的逻辑结构:都与线性表相同,为一一对应关系(线性结构)
两者的存储结构:顺序栈,链栈 / 顺序队,链队 (顺序栈、循环顺序队较为常见)
3.2栈的表示和操作的实现
栈的主要应用有:表达式求值、括号匹配、函数递归、子程序调用
顺序栈的表示和实现
顺序栈的存储方式:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素
空栈:top=base(=0)top和base均是从0开始
栈满:top-base=stacksize(stacksize表示栈可使用的最大容量,如上图stacksize=5)
栈中元素的个数:top-base
使用数组作为顺序栈存储方式的特点:简单,方便,但易产生溢出
上溢:栈满,又进栈
下溢:栈空,又出栈
上溢是一种错误,使问题的处理无法进行;下溢一般认为是一种结束条件,即问题处理结束
Ⅰ.顺序栈的初始化
Ⅱ.顺序栈的入栈
Ⅲ.顺序栈的出栈
判断栈是否栈空
清空顺序栈
销毁顺序栈
链栈的表示和实现
链栈是运算受限的单链表,只能在链表头部进行操作
链栈中指针的方向和单链表中的相反(主要是为了便利计算)
Ⅰ.链栈的初始化
Ⅱ.链栈的入栈
Ⅲ.链栈的出栈
Ⅳ.取栈顶元素
Ⅴ.判断链栈是否为空
3.3栈与递归
递归:若一个对象部分地包含自己,或用它自己给自己定义,则称这个对象是递归的
若一个过程直接或间接地调用自己,则称这个过程是递归的过程
一个递归算法必须包括终止条件和递归部分
递归程序在执行时需要系统提供栈来实现
设计递归问题的非递归算法一般需要用到堆栈机制
实现递归调用中的存储分配通常用栈数据结构
3.4队列的表示和操作的实现
队列的主要应用有:打印机缓存
顺序队列
这里循环队列队满要考
Ⅰ.循环队列的初始化
Ⅱ.循环队列的长度
对于非循环队列,队列的长度为头指针和尾指针的差值
Ⅲ.循环队列的入队
这里队尾指针的变化常考,记得是对数组长度取模
Ⅳ.循环队列的出队
Ⅴ.取队头元素
链式队列
最适合用作链式队列的链表是:带有队头指针和队尾指针的非循环单链表
Ⅰ.链队列的初始化
Ⅱ.链队列的销毁
Ⅲ.链队列的入队
对于链式队列,在执行插入操作时,头尾指针可能都要修改
这里我们要看有没有头结点:1)没有头结点的情况下,当队列为空时,头尾指针都要修改
2)有头结点的情况下,只需改尾指针
Ⅳ.链队列的出队
所以对于链式队列,在执行出队操作时,头尾指针可能都要修改
一般情况下只修改头指针,如果删除的点正好是队列中最后一个元素时,队尾指针会丢失,则尾指针要重新赋值