初阶数据结构(六)队列的介绍与实现

💓博主csdn个人主页:小小unicorn💓
⏩专栏分类:C++

🚚代码仓库:小小unicorn的学习足迹🚚
🌹🌹🌹关注我带你学习编程知识

  • 队列的介绍
    • 队列的概念:
    • 队列的结构:
  • 队列的实现
    • 创建队列
    • 初始化队列
    • 销毁队列
    • 队尾入队列
    • 对头出队列
    • 获取队列头部元素
    • 获取队列尾部元素
    • 检测队列是否为空
    • 获取队列中有效元素个数
  • 总结:

队列的介绍

队列的概念:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列遵守先进先出FIFO(First In First Out)的原则。

入队列:队列的插入操作叫做入队列,进行插入操作的一端称为队尾。

出队列:队列的删除操作叫做出队列,进行删除操作的一端称为队头。

队列的结构:

在这里插入图片描述

队列的实现

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建队列

首先我们需要创建一个结点类型,类型包含了该结点的数据指向下一结点的指针。

typedef int QDataType;typedef struct QListNode
{struct QListNode* next;               //指针域QDataType data;                       //数据域
}QListNode;

其次队列与普通链表又有所不同,普通链表只需要知道链表的头指针,而队列的信息包括了队头和队尾,所以我们需要再创建一个结构体用于存放队列的队头和队尾。

typedef struct Queue
{QListNode* head;//队头QListNode* tail;//队尾
}Queue;

初始化队列

我们需要一个初始化函数,对刚创建的队列进行初始化

//初始化队列
void QueueInit(Queue* pq)
{assert(pq);//起始时队列为空pq->head = NULL;pq->tail = NULL;
}

销毁队列

因为队列中的每一个结点所占用的内存空间都是动态开辟的,当我们使用完队列后需要及时释放队列中的每一个结点。

//销毁队列
void QueueDestroy(Queue* pq)
{assert(pq);QListNode* cur = pq->head;//接收队头//遍历链表,逐个释放结点while (cur){QListNode* next = cur->next;free(cur);cur = next;}pq->head = NULL;//队头置空pq->tail = NULL;//队尾置空
}

队尾入队列

入队列,也就是说申请一个新结点并将其链接到队尾,然后改变队尾的指针指向

需要注意的是:若队列中原本无数据,那么我们只需让队头和队尾均指向这个新申请的结点即可。

//队尾入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QListNode* newnode = (QListNode*)malloc(sizeof(QListNode));//申请新结点if (newnode == NULL){printf("malloc fail\n");exit(-1);}newnode->data = x;                                        //新结点赋值newnode->next = NULL;                                     //新结点指针域置空if (pq->head == NULL)                                     //队列中原本无结点{pq->head = pq->tail = newnode;                         //队头、队尾直接指向新结点}else                                                       //队列中原本有结点{pq->tail->next = newnode;                              //最后一个结点指向新结点pq->tail = newnode;                                    //改变队尾指针指向}
}

对头出队列

出队列,也就是释放队头指针指向的结点并改变队头指针的指向

若队列中只有一个结点,那么直接将该结点释放,然后将队头和队尾置空即可。

//队头出队列
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));                            //检测队列是否为空if (pq->head->next == NULL)                         //队列中只有一个结点{free(pq->head);pq->head = NULL;pq->tail = NULL;}else//队列中有多个结点{QListNode* next = pq->head->next;free(pq->head);pq->head = next;                                 //改变队头指针指向}
}

获取队列头部元素

获取队列头部元素,就是返回队头指针指向的数据。

//获取队列头部元素
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));                        //检测队列是否为空return pq->head->data;                          //返回队头指针指向的数据
}

获取队列尾部元素

获取队列尾部元素,也就是返回队尾指针指向的数据。

//获取队列尾部元素
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));                  //检测队列是否为空return pq->tail->data;                    //返回队尾指针指向的数据
}

检测队列是否为空

检测队列是否为空,也就是判断队头指针指向的内容是否为空。

//检测队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL;
}

获取队列中有效元素个数

队列中有效元素个数,也就是队列中的结点个数

我们只需遍历一下队列,统计队列中的结点数并返回即可。

//获取队列中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);QListNode* cur = pq->head;                       //接收队头int count = 0;                                   //记录结点个数while (cur)                                      //遍历队列{count++;cur = cur->next;}return count;                                    //返回队列中的结点数
}

总结:

初阶数据结构(五)(六)讲的是栈和队列,它们都是特殊的线性表,只不过对插入和删除操作做了限制。

(stack)是限定仅在表尾进行插入和删除操作的线性表。

对列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线
性表。

它们均可以用线性表的顺序存储结构来实现,但都存在着顺序存储的一些弊端。因此它们各自有各自的技巧来解决这个问题。

对于栈来说,如果是两个相同数据类型的栈,则可以用数组的两端作栈底的方法来让两个栈共享数据,这就可以最大化地利用数组的空间。

对于队列来说,为了避免数组插入和删除时需要移动数据,于是就引入了循环队列,使得队头和队尾可以在数组中循环变化。解决了移动数据的时间损耗,使得本来插入和删除是O(n)的时间复杂度变成了O(1)。

它们也都可以通过链式存储结构来实现,实现原则上与线性表基本相同,如下图所示。

文章到这里就要告一段落了,有更好的思路或问题的,欢迎留言评论区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境:NginxPHP7.0MySQL5.6thinkphp伪静态

剑指 Offer 43. 1~n 整数中 1 出现的次数

目录 ​编辑 一,问题描述 二,例子 三,题目接口 四,题目解答 1,暴力解法 2.规律解法 总结: 代码: 一,问题描述 输入一个整数 n ,求1~n这n个整数的十进…

2023高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

1. 卷积原理

① 卷积核不停的在原图上进行滑动,对应元素相乘再相加。 ② 下图为每次滑动移动1格,然后再利用原图与卷积核上的数值进行计算得到缩略图矩阵的数据,如下图右所示。 import torch import torch.nn.functional as Finput torch.tensor([[1, 2…

mysql并行效率提升

下面是一个并行读取mysql数据库表的测试程序,测试结果发现,读取10个表,1个个读取,和并行读取10个,效率一样,甚至并行读取还慢很多,这是为什么? con get_db_conn() results {} poo…

布隆过滤器

目录 初识布隆过滤器使用布隆过滤器布隆过滤器如何实现布隆过滤器使用场景布隆过滤器存在问题解决策略 初识布隆过滤器 布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一…

具有优异导电性能且抑制了准饱和效应的1200V 4H-SiC沟槽MOSFET

标题:1200V 4H-SiC trench MOSFET with superior figure of merit and suppressed quasi-saturation effect 摘要 本文提出一种具有部分被埋层n区包围的p屏蔽区的优异性能(FoM)1200V 4H-SiC沟槽MOSFET。在准饱和(QS)状态下,埋层n区抑制由p屏蔽区形成的耗…

异地访问Oracle数据库的解决方案:利用内网穿透实现PL/SQL远程连接的建议与步骤

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle ​ 小月糖糖主页 在强者的眼中,没有最…

【C++】特殊类的设计

特殊类的设计 前言正式开始设计一个类,不能被拷贝设计一个类,只能在堆上创建对象设计一个类,只能在栈上创建对象设计一个类,不能被继承设计一个类,只能创建一个对象(单例模式)饿汉模式懒汉模式总结 前言 点进来的同学…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容,通过计算机网络的开发技术,在互联网上进行展示,然后通过计算机网…

Little Kernel代码学习笔记

目录 虚拟地址转换为物理地址内核启动Multiboot头部结构启动时的寄存器状态real_start段选择子初始化BSS段 页表转换设置CR4、CR3、EFER寄存器设置页表映射 初始化IDT,执行lk_main 虚拟地址转换为物理地址 // start.S#define PHYS_LOAD_ADDRESS (MEMBASE KERNEL_L…

多功能租车平台微信小程序源码 汽车租赁平台源码 摩托车租车平台源码 汽车租赁小程序源码

多功能租车平台微信小程序源码是一款用于汽车租赁的平台程序源码。它提供了丰富的功能,可以用于租赁各种类型的车辆,包括汽车和摩托车。 这个小程序源码可以帮助用户方便地租赁车辆。用户可以通过小程序浏览车辆列表,查看车辆的详细信息&…

npm 卸载 vuecli后还是存在

运行了npm uninstall vue-cli -g,之后是up to date in,然后vue -V,版本号一直都在,说明没有卸载掉 1、执行全局卸载命令 npm uninstall vue-cli -g 2、删除vue原始文件 查看文件位置,找到文件删掉 where vue 3、再…

[Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

目录 题目:辗转相除法(求最大公约数)思路分析:辗转相除法(也叫欧几里得算法)gcd(a,b) gcd(b,a mod b)复杂度:时间复杂度 O ( n l o g ( m a x ) ) O(nlog(max)) O(nlog(max))、空间复杂度 O (…

探索pytest:Python自动化测试的新境界

在当今的软件开发领域,测试已经不仅仅是一个简单的步骤,而是确保软件质量的核心环节。Python,作为全球最受欢迎的编程语言之一,拥有丰富的测试框架和工具。而在这其中,pytest无疑是最受欢迎和最具影响力的一个。本文将…

ICS PA1

ICS PA1 init.shmake 编译加速ISA计算机是个状态机程序是个状态机准备第一个客户程序parse_argsinit_randinit_loginit_meminit_isa load_img剩余的初始化工作运行第一个客户程序调试:零断点TUI 基础设施单步执行打印寄存器状态扫描内存 表达式求值词法分析递归求值…

Go的基础运行方式和打包

目录 基础运行方式导入路径 打包技巧相关知识点 基础运行方式 // 文件名可以不是main,但包名和入口函数比如是main // main.go package main // 导入包的时候可以直接导入,也可以导入后指定包名, import ("fmt"godemo "githu…

Android学习之路(10) setContentView详解

一、简介 setContentView我们在Activity中经常见到,它的作用就是把我们的布局文件放在Activity中显示,下面我们根据源码分析setContentView是如何做到的 二、源码分析 1.两种setContentView 注意Activity的setContentView和AppCompatActivity的setCo…

斯坦福人生设计课——简略笔记

来源:⽐尔博内特 戴夫伊万斯 著图书《人生设计课》 目录 一、认清当下的情况,从四个维度观察自己的人生 二、平衡人生,但不要走入误区 2.1 记录你的“美好时光日志”: 2.1.1 记录内容: 2.1.2 辅助反思的方法&…

WebRTC音视频通话-iOS端调用ossrs直播拉流

WebRTC音视频通话-iOS端调用ossrs直播拉流 之前实现iOS端调用ossrs服务,文中提到了推流。没有写拉流流程,所以会用到文中的WebRTCClient。请详细查看:https://blog.csdn.net/gloryFlow/article/details/132262724 一、iOS播放端拉流效果 二…