当前位置: 首页 > news >正文

《数据结构之美--栈和队列》

一:引言:

上次我们学习了双向链表的实现,这次我们来学习两个新的数据结构,因为比较简单,就放在一块学习。

二:栈的实现

1. 栈的结构与性质

只凭文字来描述的话不够生动,下面我们就以图画的形式来直观感受一下

在这里插入图片描述

2. 思考:

既然我们已经知道了的结构和性质,那么就是来实现。我们用什么来实现呢?
先来考虑拿刚学的链表来实现
在这里插入图片描述

接着再来考虑用顺序表来实现
在这里插入图片描述
可以看到用顺序表链表实现的时间复杂度都为o(1),那么只好再从空间角度来比较,若用链表来实现的话,需要不停地申请新节点,并且链表的存储结构还不一定连续,容易造成空间的碎片化,而顺序表的话存储结构是一个接一个的连续着的,空间利用率会更好,并且顺序表采用动态数组,也能做到动态扩容,因此,结合以上几点分析,还是用顺序表来实现更好一点。

3. 定义栈

在这里插入图片描述
因为进栈出栈都是在栈顶进行,因此这里需要定义栈顶位置,除了动态数组,还需要知道的空间大小,因此再定义一个容器大小

4. 初始化

声明:

注意这里因为要改变结构体中的成员,因此传入的是结构体指针(结构体的地址)
在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述

5. 入栈

声明:

在这里插入图片描述

逻辑分析:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述
可以看到测试正常

6. 出栈

声明:

在这里插入图片描述

逻辑分析:

出栈其实就是顺序表的删除逻辑,只需让top--即可,这时top位置的元素就是无效元素了。
注:但进行出栈操作之前还要判断是否为空,也就是top是否为0。

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述
可以看到测试没问题

7. 取出栈顶元素

声明:

在这里插入图片描述

逻辑实现:

因为在每次入之后top会往后走一格,因此栈顶位置即为top - 1
在这里插入图片描述

8. 栈中有效元素个数

声明:

在这里插入图片描述

逻辑实现:

由于我们是从下标为0的位置开始使用,因此top的值即为中有效元素的个数
在这里插入图片描述

9.销毁

声明:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述

三:队列的实现

1. 队列的结构和性质

队列:一种具有先进先出性质的连续存储的数据结构。
下面通过图画来辅助理解:
在这里插入图片描述

2.思考:

在知道了队列的性质和结构之后,就是来实现队列,下面我们还是从顺序表链表的角度来考虑。
先来看顺序表:
在这里插入图片描述
接下来再看链表:
在这里插入图片描述
通过上述分析可以看到无论是顺序表还是链表,时间复杂度都不能做到入队出队的时间复杂度同时为o(1)
因此就需要想办法来优化一下:我们可以发现:队列的出队入队,一个是针对队头,一个是针对队尾,队列的中间部分我们不关心,并且队列是由一个个节点组成的,因此可以分为两个结构,定义一个队列结构,定义一个节点结构,这样就可以实现队列出队入队时间复杂度都为o(1)

3. 定义队列

在这里插入图片描述

这里我们先定义了每个节点的结构,然后定义了队列结构,其中维护了指向队头和指向队尾的两个结构体指针

4. 初始化

声明:

这里还是老样子,由于需要修改结构体的成员,要改变实参,因此传入的是结构体指针(结构体的地址)
在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述
可以看到初始化正常、

5.入队

声明:

在这里插入图片描述

逻辑分析:

在这里插入图片描述

逻辑实现:

在这里插入图片描述
进队分为了两种情况:空队列非空队列

6. 判空

声明:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

7.出队

声明:

在这里插入图片描述

逻辑分析:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

8. 取出队头元素

声明:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述
这里我们让1 2 依次入队,之后我们又执行了一次出队,因此队头就成了2

9. 取出队尾元素

声明:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述

10.队列中有效元素个数

声明:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述

11.销毁

声明:

在这里插入图片描述

逻辑实现:

在这里插入图片描述

测试:

在这里插入图片描述

总结:

在这篇博客中,我们实现了具有先进后出性质的和具有先进先出性质的队列
下篇博客我们将练习几道关于队列oj题

相关文章:

  • SpringBootTest报错
  • Ext Direct 功能与使用详解
  • NI Multisim官网下载: 电路设计自动化EDA仿真软件
  • Go语言中包导入下划线的作用解析
  • 文件上传--WAF绕过干货
  • SAM12
  • 协作开发攻略:Git全面使用指南 — 第二部分 高级技巧与最佳实践
  • DPIN在AI+DePIN孟买峰会阐述全球GPU生态系统的战略愿景
  • 亚马逊英国站FBA费用重构:轻小商品迎红利期,跨境卖家如何抢占先机?
  • A2A Agent 框架结构化分析报告
  • 基于 EFISH-SBC-RK3588 的无人机多光谱/红外热成像边缘计算方案
  • 数据集中常见的11种变量类型及其在数据分析中的重要性
  • 前端微服务详解
  • 第十二章 Python语言-大数据分析PySpark(终)
  • UE5 调整字体、界面大小
  • 【AI News | 20250424】每日AI进展
  • centos7里memcached 的安装使用
  • Verilog 语法 (一)
  • 第七章:Contribution Governance
  • 【Pandas】pandas DataFrame dot
  • 美乌矿产协议预计最早于今日签署
  • AI世界的年轻人,如何作答未来
  • 街区党支部书记们亮出治理实招,解锁“善治街区二十法”
  • 宁波市纪委监委通报4起违反中央八项规定精神典型问题
  • 大型长读长RNA测序数据集发布,有助制定精准诊疗策略
  • “乐购浦东”消费券明起发放,多个商家同期推出折扣促销活动