写在前面
Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!!
如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多点赞加关注呀!❤❤❤ 爱你们!!!
目录
【往期回顾】
1. 栈和队列的定义和特点
1.1 栈和队列的定义和特点
- 栈和队列是两种常用的、重要的数据结构
- 栈和队列是限定插入和删除只能在表的“端点”进行的线性表
1.2 普通线性表的插入和删除操作
插入和删除的位置是可以随意的。
1.3 栈的应用
由于栈的操作具有后进先出的固有特性,使得栈称为程序设计中的有用工具。另外,如果问题求解的过程具有“后进先出”的天然特性的话,则求解的算法中也必然需要使用栈。例如:
1.4 队列的应用
由于队列的操作具有先进先出的特性,使得队列称为程序设计中解决类似排队问题的游泳工具。例如:
1.5 小结
栈和队列是线性表的子集(是插入和删除位置受限的线性表)
1.6 栈的定义和特点
栈(stack)是一个特殊的线性表,是限定仅在一端(通常数表尾)进行插入和删除操作的线性表,又称为后进先出(Last In First Out)的线性表,简称LIFO结构,
栈的相关概念:
栈的示意图:
入栈的操作示意图:
出栈的操作示意图:
栈的相关概念:
栈与一般线性表的区别:仅在运算规则的不同
1.7 队列的定义和特点
队列的相关概念:
2. 案例引入
2.1 案例一:进制转换
2.2 案例二:括号匹配的检验
2.3 案例三:表达式求值
2.4 案例四:舞伴问题
3. 栈的表示和操作的实现
3.1 栈的抽象数据类型的类型定义
3.2 栈的表示和实现
- 由于栈本身就是线性表,于是栈也有顺序存储和链式存储两种实现方式。
- 栈的顺序存储--顺序栈
- 栈的链式存储--链栈
3.3 顺序栈的表示和实现
存储方式:同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放从栈底到栈顶的数据元素。栈底一般在低地址端。
- 附设top指针,指示栈顶元素在顺序表中的位置。
- 另设base指针,指示栈底元素在顺序表中的位置。
但是,为了操作方便,通常top指示真正的栈顶元素之上的下标地址。
- 另外,用stacksize表示栈可使用的最大容量。
用数组作为顺序栈存储方式的特点:简单、方便,但易产生溢出(数组大小固定)
上溢(overflow):栈已经满,但又要压入元素。
下溢(underflow):栈已经空,但还要弹出元素。
注:上溢是一种错误,使问题的处理无法进行;而下溢一般认为是一种结束条件,即问题处理结束。
顺序栈的表示:
顺序栈的初始化算法:
【补充算法】顺序栈判断栈是否为空
【补充算法】求顺序栈长度
【补充算法】清空顺序栈
【补充算法】销毁顺序栈
顺序栈的入栈算法:
顺序栈的出栈算法:
3.4 链栈的表示和实现
链栈的表示:
链栈的初始化算法:
【补充算法】判断链栈是否为空
链栈的入栈算法:
链栈的出栈算法:
取栈顶元素算法:
4. 栈与递归
4.1 递归的定义
- 若一个对象部分地包含它自己,或用它自己给自己定义,则称这个对象是递归的。
- 若一个过程直接地或间接地调用它自己,则称这个过程是递归的过程。
以下三种情况常常用到递归方法:
- 递归定义的数学函数
- 具有递归特性的数据结构
- 可递归求解的问题
递归定义的数学函数:
具有递归特性的数据结构:
可递归求解的问题:
4.2 递归
递归问题--用分治法求解
分治法:对于一个较为复杂的问题,能够分解成几个相对简单的且解法相同或类似的子问题来求解。
必备的三个条件:
- 能将一个问题转变成一个新问题,而新问题与原问题的解法相同或类同,不同的仅是处理的对象,且这些处理对象是变化有规律的。
- 可以通过上述转化而使问题简化。
- 必须有一个明确的递归出口,或称递归的边界。
分治法求解递归问题算法的一般形式:
函数调用过程:
当多个函数构成嵌套调用时:
4.3 递归调用函数的实现
进行fact(4)调用的系统栈的变化状态
4.4 递归的优缺点
优点:结构清晰,程序易读。
缺点:每次调用要生成工作记录,保存状态信息,入栈;返回时要出栈,恢复状态信息,时间开销大。
递归—>非递归?
结语
本人会持续更新文章的哦!希望大家一键三连,你们的鼓励就是作者不断更新的动力