【数据结构】· 栈和队列上(栈)

写在前面


        Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误不足之处,请多多指正!谢谢大家!!!

        如果小哥哥小姐姐们对我的文章感兴趣,请不要吝啬你们的小手,多多点赞加关注呀!❤❤❤ 爱你们!!!


目录

写在前面

1. 栈和队列的定义和特点

1.1 栈和队列的定义和特点

1.2 普通线性表的插入和删除操作

1.3 栈的应用

1.4 队列的应用

1.5 小结

1.6 栈的定义和特点

1.7 队列的定义和特点

 2. 案例引入

2.1 案例一:进制转换

2.2 案例二:括号匹配的检验

2.3 案例三:表达式求值

2.4 案例四:舞伴问题​编辑

3. 栈的表示和操作的实现

3.1 栈的抽象数据类型的类型定义

3.2 栈的表示和实现

3.3 顺序栈的表示和实现

3.4 链栈的表示和实现

4. 栈与递归

4.1 递归的定义

4.2 递归

4.3 递归调用函数的实现

4.4 递归的优缺点

结语


【往期回顾】

【数据结构】· 第一章 · 线性表(下)

【数据结构】· 第一章 · 线性表(上)


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 递归的优缺点

优点:结构清晰,程序易读。

缺点:每次调用要生成工作记录,保存状态信息,入栈;返回时要出栈,恢复状态信息,时间开销大。

递归—>非递归?

 


结语


本人会持续更新文章的哦!希望大家一键三连,你们的鼓励就是作者不断更新的动力

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麟-小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值