【奇妙的数据结构世界】用图像和代码对队列的使用进行透彻学习 | C++

news2024/11/16 23:55:27

第十一章    队列


目录

第十一章    队列

●前言

●一、队列是什么?

1.简要介绍

2.具体情况

●二、队列操作的关键代码段

1.类型定义

2.顺序队列的常用操作

3.链式队列的常用操作

●总结


前言

        简单来说,数据结构是一种辅助程序设计并且进行优化的方法论,它不仅讨论数据的存储与处理的方法,同时也考虑到了数据彼此之间的关系与运算,从而极大程度的提高程序执行的效率,减少对内存空间的占用等。不同种类的数据结构适用于不同的程序应用,选择合适正确的数据结构,可以让算法发挥出更大的性能,给设计的程序带来更高效率的算法。


一、队列是什么?

1.简要介绍

        队列和堆栈都是一种线性有序列表,它们都属于抽象数据类型。在上一节我们讲了堆栈的基本特性和其操作方法,而这一节的队列在一些方面与它存在显著的差异,像队列的加入和删除这些操作都发生在不同的两端,符合一种先进先出,后进后出的特性。并且它使用front与rear两个指针分别指向队头和队尾,用其来对队列进行一系列的操作。

2.具体情况

        在我们的日常生活中,队列这种抽象模型概念是最常见的也是最常用的,像生活中基本涉及到的排队问题都是这种数据模型的直接体现。而作为程序员的我们,如何将它在代码中实现才是我们应该要去考虑的问题。队列在计算机领域的应用非常广泛,例如计算机的模拟、图形遍历的广度优先搜索法、CPU的作业调度、外围设备联机并发处理系统等等领域。像堆栈一样,队列也可以分为顺序队列和链式队列。具体情况如下图所示: 

上图 顺序队列
下图 链式队列

二、队列操作的关键代码段

1.类型定义

①顺序队列存储结构的定义

typedef struct {
	qelemtype* base;    //初始化的动态分配存储空间
	int front;    //头指针
	int rear;    //尾指针
}sqqueue;

②链式队列存储结构的定义

typedef struct qnode {
	qelemtype data;   //数据域
	struct qnode* next;  //指针域
}qnode,*queueP;  //链表的基本定义方法
typedef struct {
	queueP front;   //头指针
	queueP rear;    //尾指针
}linkqueue;    //链式指针的定义

2.顺序队列的常用操作

①队列的初始化

void initqueue(sqqueue& q)
{
	q.base = new qelemtype[maxsize];   //开拓一块新的队列区域,大小自定
	if (!q.base)   //判断队列是否创建成功
		exit(0);
	q.front = q.rear = 0;   //初始化下将头尾指针置为0,即队列为空
}

②求队列的长度

int queuelength(sqqueue& q)
{
	return ((q.rear - q.front + maxsize) % maxsize);   //算法+数据结构去求解队列的长度
}

 ③队列入队

int enqueue(sqqueue& q,qelemtype e)
{
	if ((q.rear + 1) % maxsize == q.front) {
		return 0;   
	}  //判断队列已满
	else {
		q.base[q.rear] = e;    //队列未满,尾指针指向位置为下标,向尾部插入新元素
		q.rear = (q.rear + 1) % maxsize;  //队尾指针加1
		return 1;
	}
}

④队列出队

int dequeue(sqqueue& q, qelemtype &e)
{
	if (q.front == q.rear) {
		return 0;
	}//判断队列为空
	else { 
		e=q.base[q.front];   //保存当前队头元素
		q.front = (q.front + 1) % maxsize;   //队头指针加1
		return 1;
	}
}

⑥取队头元素

qelemtype getheaddata(sqqueue& q)
{
	if (q.front != q.rear) //队列不为空
		return q.base[q.front];   //取队头元素
}

3.链式队列的常用操作

①队列初始化

void initqueue(linkqueue &q)
{
	q.front = q.rear = new qnode;   //创建链队列初始结点,并且将两个指针指向它
	if (!q.front) {
		exit(0);
	}   //判断该队列是否创建成功
	else {
		q.front->next = NULL;   //创建成功,将该结点指针域置为空
	}
}

②队列入队

int enqueue(linkqueue &q,qelemtype e)
{
	qnode* p;  //创建一个新的结点指针
	p = new qnode;  //创建一个新的结点,指针p指向它
	if (!p) {
		return 0;   //判断结点是否创建成功
	}
	else {
		p->data = e;   //将新元素放入新创建的结点中
		p->next = NULL;   //将该结点的指针域置为空,它将作为尾结点
		q.rear->next = p;   //将上一个结点的指针域连向这个新创建的入队结点
		q.rear=p;  //将尾指针指向该新结点
		return 1;
	}
}

 ③队列出队

int dequeue(linkqueue& q, qelemtype &e)
{
	qnode* p;
	if (q.front == q.rear) {
		return 0;  //判断队列为空
	}
	else {
		p = q.front->next;    //将指针p指向队头结点后的第一个数据元素
		e=p->data;    //将要出队的结点的数据元素保存
		q.front->next=p->next;    //将链队列头结点的指针域指向要出队的队头结点的下一个结点的位置
		if (q.rear == p) {
			q.rear = q.front;  //判断如果出队的是队列中最后一个元素的话,就需要将头尾指针再同时头结点
		}
		delete p;  //元素结点删除出队
		return 1;
	}
}

④取队头元素

int getheaddata(linkqueue& q, qelemtype &e)
{
	if (q.front == q.rear) {
		return 0;   //空队列的判断
	}
	else {
		e = q.front->next->data;   //取得头结点后第一个数据元素
		return 1;
	}
}

总结

        以上就是我们对队列的所有讲解情况,如果你还想对队列进行其他的操作分析,可以将原理和图像结合去编写程序代码即可,并且通过不断的调试去验证你所写的操作是否可以执行。熟悉了上面的关键代码段后,你可以通过一些典型例题去对队列这部分数据结构的知识进行实战练习。如果可以将队列合理地运用到一些程序设计问题中,那么你可能会更好更快的去解决问题。

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

 

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

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

相关文章

介绍一款2023年新出的mysql管理工具: FlyBird Database Manager

FlyBird Database Manager 介绍 FlyBird Database Manager 是一款mysql 界面化管理工具&#xff0c; 使用go语言编写&#xff0c;天然支持Windows, MacOS, Linux等主流平台。 提供无需安装的命令行版本&#xff0c; 命令行中启动服务&#xff0c;以html支持UI界面,在浏览器中…

[Linux]进程控制

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

1607_PC汇编语言_汇编语言简介

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 刚刚看了一个小章节&#xff0c;感觉是对8086的汇编做了一个简单的介绍。当然&#xff0c;这里面也有各种机器汇编通用的属性。 1. 等价符号关联的两个表达其实是等…

在线教育-谷粒学院学习笔记(十)

文章目录1 介绍2 登录业务流程3 JWT令牌4 阿里云短信服务5 登录功能6 注册功能7 根据token获取用户信息8 整合首页登录和注册1 介绍 登录实现流程 注册接口 整合JWT整合阿里云短信服务 登录接口 注册、登录的前端实现 2 登录业务流程 单一服务器模式 使用session对象实现 …

仿牛客论坛项目(下)

代码仓库:https://gitee.com/qiuyusy/community 仿牛客论坛项目15.kafka1.阻塞队列2.Kafka入门简介术语解释下载配置命令3.Spring整合Kafka引入依赖配置代码16.系统通知(Kafka)发送系统通知功能(点赞关注评论)1.编写Kafka消息队列事件Event实体类2.编写Kafka生产者3.编写Kafka消…

Spring 源码编绎

本示例基于 spring-framework-5.2.22.RELEASE GradleWapper jdk1.8.0_131编译# 环境准备mavenjdk8idea# 源码下载进入https://github.com/spring-projects/spring-frameworkSpring的源码是发布在github上面的下载最新版发布版源码不要太纠结版本区别&#xff0c;无需刻意保证…

BM5 合并k个已排序的链表

目录 描述 示例1 示例2 思路&#xff1a; 代码&#xff1a; 描述 合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。 示例1 输入&#xff1a;[{1,2,3},{4,5,6,7}] 返回值&#xff1a;{1,2,3,4,5,6,7} 示例2 输入&#xff1a;[{1,2},{1,4,5},{6}] 返回值…

Linux常用命令——rmmod命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) rmmod 从运行的内核中移除指定的内核模块 补充说明 rmmod命令用于从当前运行的内核中移除指定的内核模块。执行rmmod指令&#xff0c;可删除不需要的模块。Linux操作系统的核心具有模块化的特性&#xff0c;应…

Elasticsearch(六)--ES文档的操作(中)---修改文档

一、前言 上篇文章我们了解了ES的插入和批量插入文档的操作&#xff0c;分别通过ES的kibana客户端以及Java高级Rest客户端进行学习&#xff0c;那么本篇则进入到对文档的修改操作&#xff0c;同新增文档&#xff0c;也有更新单条文档和批量更新文档操作&#xff0c;但还多出一…

Day873.普通索引唯一索引的选择 -MySQL实战

普通索引&唯一索引的选择 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于普通索引&唯一索引的选择的内容。 假设你在维护一个市民系统&#xff0c;每个人都有一个唯一的身份证号&#xff0c;而且业务代码已经保证了不会写入两个重复的身份证号。 如果市民…

Java基础项目实战--大学生求职招聘信息网站系统

Java基础项目实战–大学生求职招聘信息网站系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系…

基于php的婚纱商城管理系统

摘要网络技术给生活带来了十分的便利。所以把婚纱商城管理系统与现在网络相结合。在婚纱商城发展的整个过程中&#xff0c;婚纱信息管理担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的婚纱商城管理系统&#xff0…

自动驾驶介绍、应用、前景

自动驾驶介绍、应用、前景1 介绍1.1 定义1.2 作用1.3 发展历程1.4 分类23年初竞争格局1.5 顾虑1.6 前景2 产业链现状2.1 芯片2.2 仿真3 技术路线3.1 是否交互3.1.1 单车智能3.1.2 车路协同3.2 主传感器区分3.2.1 纯视觉3.2.2 混合传感器3.3 前装还是后装3.3.1 前装3.3.2 后装4 …

基于java SSM医药住院管理系统设计和实现

基于java SSM医药住院管理系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 …

宇隆光电冲刺上交所上市:毛利率持续下滑,收入极其依赖京东方

近日&#xff0c;重庆宇隆光电科技股份有限公司&#xff08;下称“宇隆光电”&#xff09;预披露招股书&#xff0c;准备在上海证券交易所主板上市。 本次冲刺上市&#xff0c;宇隆光电计划募资15亿元&#xff0c;其中7亿元用于OLED控制板及液晶模组控制板和精密模切生产基地项…

Spring Cloud_服务监控hystrixDashboard

目录一、概述二、仪表盘90011.新建Module2.POM3.YML4.主函数5.Provider微服务提供类都需要监控依赖配置6.启动仪表盘三、断路器演示1.修改cloud-provider-hystrix-payment80012.监控测试代码链接 https://github.com/lidonglin-bit/cloud 一、概述 除了隔离依赖服务的调用以外…

背景图片大小设置 解决背景图多张铺满盒子 背景图和背景颜色混用

目录更多的样式透明度鼠标样式&#xff1a;cursor盒子隐藏背景图和img元素的区别涉及的css属性1. background-image:url(“”)2. background-repeat3. background-size解决图片多张铺满盒子的问题4. background-position5. background-attachment6. 背景图和背景颜色混用7. 速写…

Jackson使用详细介绍

Jackson使用详细介绍一 . Jackson 介绍二. Jackson Maven 依赖三. ObjectMapper 对象映射器四. Jackson JSON 基本操作1. Jackson JSON 序列化2. Jackson JSON 反序列化3. JSON 转 List4. JSON 转 Map5. Jackson 忽略字段6. Jackson 日期格式化Date 类型LocalDateTime 类型时间…

动态内存分配

目录 一、内存使用方式 &#xff08;一&#xff09;一个c/c编译的程序占用的内存分为以下几个部分 二、malloc &#xff08;一&#xff09;malloc 1. 举例&#xff1a;malloc(4) 2. 如何理解malloc(size(Var_T)*N) 3. 举例 &#xff08;二&#xff09;静态、全局指针…

【数据结构与算法】队列-模拟实现队列以及设计循环队列

文章目录队列的概念链表实现栈设计循环队列总结队列的概念 队列是一种特殊的线性表&#xff0c;特殊之处在于它只允许在表的前端&#xff08;front&#xff09;进行删除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;进行插入操作&#xff0c;和栈一样&#xff0c;…