队列(Queue)的介绍与实现

文章目录

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

队列

队列的概念及结构

  • 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。队列遵守先进先出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;//返回队头指针指向的数据
}

检测队列是否为空

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

//检测队列是否为空
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;//返回队列中的结点数
}

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

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

相关文章

3.1 快速启动Flink集群

文章目录 1. 环境配置2. 本地启动3. 集群启动4. 向集群提交作业4.1 提交作业概述4.2 添加打包插件4.3 将项目打包4.4 在Web UI上提交作业4.5 命令行提交作业 在本实战中,我们将快速启动Apache Flink 1.13.0集群,并在Hadoop集群环境中提交作业。首先&…

[sa-token]StpUtil.getLoginId

闲聊 一般情况下,我们想用uid,可能需要前端将uid传过来,或者将token传来,然后我们进行识别。 用了sa-token之后,可以使用StpUtil.getLoginId()方法获取当前会话的用户id 代码展示 例如以下代码: public Res…

算法实现 - 快速排序(Quick Sort) - 理解版

文章目录 算法介绍算法分析核心思想三个版本运行过程挖坑法Hoare 原版前后指针法 算法稳定性和复杂度稳定性时间复杂度平均情况O(nlogn)最差情况O( n 2 n^2 n2) 空间复杂度 算法介绍 快速排序是一种高效的排序算法,由英国计算机科学家C. A. R. Hoare在1960年提出&a…

算法【Java】—— 动态规划之斐波那契数列模型

动态规划 动态规划的思路一共有五个步骤: 状态表示:由经验和题目要求得出,这个确实有点抽象,下面的题目会带大家慢慢感受状态标识状态转移方程初始化:避免越界访问 dp 表,所以在进行填表之前我们要预先填…

03:选择语句的练习

选择语句的练习 1、分数判断2、判断年份3、判断水仙花数 1、分数判断 输入分数判断为&#xff1a;不及格(0 ≤ x <60)&#xff0c;一般(60 ≤ x < 75)&#xff0c;良好(75 ≤ x < 85)&#xff0c;优秀(85 ≤ x ≤ 99)&#xff0c;满分(100)。 #include <stdio.h&g…

gulp入门教程2:gulp发展历史

早期阶段&#xff08;2013年-2014年&#xff09; 诞生背景&#xff1a;随着前端开发复杂度的增加&#xff0c;开发者们开始寻求自动化工具来简化构建流程。2013年&#xff0c;由Fractal Innovations的Eric Schoffstall首次发布。它借鉴了Unix管道的流式处理思想&#xff0c;通…

SpringBoot学生请假系统:从零到一的构建过程

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

json-server的使用(根据json数据一键生成接口)

一.使用目的 在前端开发初期&#xff0c;后端 API 可能还未完成&#xff0c;json-server 可以快速创建模拟的 RESTful API&#xff0c;帮助前端开发者进行开发和测试。 二.安装 npm install json-server //局部安装npm i json-server -g //全局安装 三.使用教程 1.准备一…

【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型

一、介绍 车辆车型识别&#xff0c;使用Python作为主要编程语言&#xff0c;通过收集多种车辆车型图像数据集&#xff0c;然后基于TensorFlow搭建卷积网络算法模型&#xff0c;并对数据集进行训练&#xff0c;最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操…

【Redis】浅析Redis大Key

目录 1、什么是Redis大Key 2、大 Key 是怎么产生的 3、大 Key 导致的问题 4、如何快速找到 Redis 大 Key 5、大 Key 优化策略 6、总结 我们在使用 Redis 的过程中&#xff0c;如果未能及时发现并处理 Big keys&#xff08;下文称为“大Key”&#xff09;&#xff0c;可能…

Rocky DEM tutorial3_Vibrating Screen_振荡筛

tutorial3_Vibrating Screen_振荡筛 文章目录 tutorial3_Vibrating Screen_振荡筛0. 目的1. 模型介绍2. 模型设置2.1 Physics设置2.2 导入几何2.3 创建一个进口的几何面2.4 定义运动 Motion frame2.5 材料设置&#xff0c;保持默认即可2.6 设置材料间的相互作用 materials inte…

小林渗透入门:burpsuite+proxifier抓取小程序流量

目录 前提&#xff1a; 代理&#xff1a; proxifier&#xff1a; 步骤&#xff1a; bp证书安装 bp设置代理端口&#xff1a; proxifier设置规则&#xff1a; proxifier应用规则&#xff1a; 结果&#xff1a; 前提&#xff1a; 在介绍这两个工具具体实现方法之前&#xff0…

阿里云-防火墙设置不当导致ssh无法连接

今天学网络编程的时候&#xff0c;看见有陌生ip连接&#xff0c;所以打开了防火墙禁止除本机之外的其他ip连接&#xff1a; 但是当我再次用ssh的时候&#xff0c;连不上了才发现大事不妙。 折腾了半天&#xff0c;发现阿里云上可以在线向服务器发送命令&#xff0c;所以赶紧把2…

深度学习基础(2024-11-02更新到图像尺寸变换 与 裁剪)

1. 名词解释 FFN FFN &#xff1a; Feedforward Neural Network&#xff0c;前馈神经网络馈神经网络是一种基本的神经网络架构&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;FFN 一般主要是包括多个全连接层(FC)的网络&#xff…

代码的缘起

代码的发展历程是一个从简单到复杂、从底层硬件操作逐步抽象为更高级别语言的过程。自图灵和冯诺依曼等先驱者奠定了计算机科学的基础以来&#xff0c;软件编程逐渐成为了连接人类思维与机器逻辑的桥梁。最初的程序设计依赖于直接控制计算机硬件的低级语言&#xff0c;如汇编语…

2025年上半年软考高级科目有哪些?附选科指南

新手在准备报考软考时&#xff0c;都会遇到这样的一个问题——科目这么多&#xff0c;我适合考什么&#xff1f;2025上半年软考高级有哪些科目可以报考&#xff1f;要想知道自己适合报什么科目&#xff0c;就需要了解每个科目是什么&#xff0c;考什么等一系列的问题&#xff0…

【初阶数据结构篇】链式结构二叉树(二叉链)的实现(感受递归暴力美学)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

pip install -r requirements.txt下载速度慢

安装包下载速度慢&#xff0c;切换镜像源 方法 1&#xff1a;直接使用镜像源加速安装&#xff08;推荐&#xff09;方法 2&#xff1a;修改 pip 配置文件 方法 1&#xff1a;直接使用镜像源加速安装&#xff08;推荐&#xff09; 在安装命令后添加 -i 参数&#xff0c;并指定国…

Php实现钉钉OA一级审批,二级审批

Php实现钉钉OA一级审批&#xff0c;二级审批 一级审批 public function oaPush($user_id,$person,$data){//测试数据&#xff0c;上线需要删除$user_id 154502333155;//发起人$person [154502665555];//审批人$len count($person);$result null;if($len>0){$approve_con…

2024年第六届全球校园人工智能算法精英大赛——【算法挑战赛】钢材表面缺陷检测与分割 比赛复盘

引言 钢材表面缺陷检测在钢铁生产中是确保质量的关键环节&#xff0c;传统的人工检测方式难以满足大 规模工业生产的需求。近年来&#xff0c;基于深度学习的缺陷检测方法因其高效性和准确性受到广泛关 注。然而&#xff0c;现有的深度学习模型如U-Net虽具备较好的分割性能&am…