【数据结构】队列及其实现

目录

1.队列的概念及结构

2.队列的实现

2.1队列结构定义 

2.2队列的初始化及销毁

2.3数据入队

2.4数据出队

2.5访问队头数据

2.6访问队尾数据

2.6判断队列是否为空

2.7求队列的大小

2.7打印队列 


1.队列的概念及结构

队列:只允许在一端进行插入数据操作,另一端进行删除数据操作的特殊线性表

队列中先进先出FIFO(First In First Out)

入队列:进行插入操作的一端称为队尾

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

2.队列的实现

队列结构可以使用数组和链表结构实现,但一般采用的是链表,因为对于数组结构,队头出数据的效率较低

2.1队列结构定义 

使用链表实现队列,队列中的每个元素都是节点的形式,所以需要定义节点的结构

对于队列,其具有队尾入数据,队头出数据的特性,所以其结构定义需要两个指针,分别指向队头和队尾

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;
}Queue;

2.2队列的初始化及销毁

初始化即队列为空队列,队头指针和队尾指针都指向空

销毁队列,即释放队列中所有节点的空间,队头指针和队尾指针重新指向空

//队列初始化
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;
}
//队列销毁
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* del = cur;cur = cur->next;free(del);}pq->head = pq->tail = NULL;
}

2.3数据入队

队列结构中,数据入队从队尾入,需要考虑空队列和非空队列两种情况

1️⃣空队列:

2️⃣非空队列:

 空队列和非空队列不同的是空队列插入数据时需要更新队头指针

//数据入队
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(-1);}else{newnode->data = x;newnode->next = NULL;}//空队列时插入if (pq->tail == NULL){pq->head = pq->tail = newnode;}//非空队列时插入else{pq->tail->next = newnode;//链接新元素pq->tail = newnode;//更新队尾}
}

2.4数据出队

队列结构中,数据出队从队头出,对于空队列,出队操作非法

出队操作后,需要更新队头指针,并释放已出队节点的空间

特殊情况:队列中只有一个节点

//数据出队
void QueuePop(Queue* pq)
{assert(pq);//空队列不能进行出队操作assert(!QueueEmpty(pq));//队列中只有一个元素if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* del = pq->head;pq->head = pq->head->next;free(del);del = NULL;}
}

2.5访问队头数据

队头数据的访问操作在队列为空时非法,所以需要先断言,非空链表才可以进行队头数据的访问操作,通过队头指针访问即可

//访问队头数据
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;}

2.6访问队尾数据

队尾数据的访问操作在队列为空时非法,所以需要先断言,非空链表才可以进行队尾数据的访问操作,通过队尾指针访问即可

//访问队尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}

2.6判断队列是否为空

队列为空则队头指针和队尾指针都指向空,可以使用if-else语句进行返回

也可以参考以下代码,直接返回pq->head == NULL && pq->tail == NULL,只有当pq->head和pq->tail同时为NULL是才返回真,即队列为空

📖Note:

判空函数的返回类型为bool,但是C语言标准中没有bool类型,所以需要我们自己定义

#define bool int
//判断队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);/*if (pq->tail == pq->head == NULL){return true;}else{return false;}*/return pq->head == NULL && pq->tail == NULL;
}

2.7求队列的大小

求队列的大小,遍历统计节点个数并返回即可

//求队列的大小
int QueueSize(Queue* pq)
{assert(pq);int size = 0;QNode* cur = pq->head;while (cur){size++;cur = cur->next;}return size;
}

2.7打印队列 

为了便于观察入队与出队操作,可以编写一个打印函数便于调试

//打印队列
void QueuePrint(Queue* pq)
{assert(pq);QNode* cur = pq->head;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}

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

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

相关文章

ECMAScript 2023(ES14)中的所有新功能

​JavaScript在持续发展,近期ECMAScript 14中发布添加了一批新功能,让我们一起来探索一下今年对JavaScript开发人员的新功能。时间的车轮又过去了一年,随之而来的是JavaScript的新官方版本:ECMAScript 2023,也被称为EC…

与微服务平台厂家联手,一起实现高效率发展!

在如今的快节奏发展社会中,只有利用科技的力量,才能与市场接轨,了解市场和客户需求,最终实现更快速的发展。如果还停留在闭门造车的环境中,不“引进来,走出去”,那势必会与成功擦肩而过。微服务…

clickHouse部署

docker仓库地址 https://hub.docker.com/ 1、docker环境搭建 # 1.先安装yml yum install -y yum-utils device-mapper-persistent-data lvm2 # 2.设置阿里云镜像 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 3.查…

【芯片前端】auto_testbench的大版本升级——加入简单预期与自动比对

前言 前文提要: 【芯片前端】一键生成简易版本定向RTL验证环境的脚本——auto_verification_rtl脚本_尼德兰的喵的博客-CSDN博客 【芯片前端】可能是定向验证的巅峰之作——auto_testbench_autotestbench_尼德兰的喵的博客-CSDN博客 工具路径: auto…

广告聚合平台能为APP开发者提供哪些帮助

应用变现平台是帮助开发者优化广告策略并最终获得更多收入的综合途径。在广告变现过程中,接入单一的广告联盟,变现效率不高,并且开发者需要花费许多精力进行筛选和管理,难免会应接不暇,而聚合广告平台的出现则一定程度…

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会)

GloVe、子词嵌入、BPE字节对编码、BERT相关知识(第十四次组会) Glove子词嵌入上游、下游任务监督学习、无监督学习BERTGlove 子词嵌入 上游、下游任务 监督学习、无监督学习 BERT

springboot使用configtree读取树形文件目录中的配置

文章目录 一、介绍二、演示环境三、项目演示1. 配置文件2. 导入配置3. 检测配置属性 四、应用场景五、源码解析1. ConfigTreeConfigDataLocationResolver2. ConfigTreeConfigDataLoader 六、总结 一、介绍 相信绝大多数使用springboot开发项目的朋友们在添加配置时&#xff0c…

【从零学习python 】23. Python中集合(set)的使用方法和常见操作

文章目录 set的使用创建格式添加元素移除元素set常见方法列表练习 进阶案例 set的使用 集合(set)是一个无序的不重复元素序列,可以使用大括号 { } 或者 set() 函数创建集合。 注意:创建一个空集合必须用 set() 而不是 { }&#x…

母婴即时零售行业数据可视化分析

对新晋父母来说,很多母婴用品如同一位贴心的助手,为他们的宝宝提供温暖和呵护。从婴儿床垫到可爱的拼图玩具,每一件用品都是为宝宝的成长和发展量身定制。对于繁忙的父母们而言,这些用品不仅帮助照顾孩子,更是为他们减…

一百五十一、Kettle——Linux上安装的kettle8.2开启carte服务以及配置子服务器

一、目的 kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后,准备在Linux上启动kettle的carte服务 二、实施步骤 (一)carte服务文件路径 kettle的Linux运行的carte服务文件是carte.sh (二…

手机两个卡槽的正确使用方法,您用对了吗?

手机上有两个卡槽,该如何搭配才能使话费降到最低?你又是怎么搭配的? 这篇文章小编就来告诉你,如何在不换号的情况下,将自己的话费降到最低。 首先卡槽一我们就用8元保号套餐。 卡槽二,我们就可以办理一张…

【C语言】每日一题(寻找数组的中心下标)

寻找数组的中心下标,链接奉上 方法 暴力循环前缀和 暴力循环 ​​​​​​​思路: 依旧是我们的老朋友,暴力循环。 1.可以利用外层for循环,循环变量为数组下标,在循环内分别求出下标左边与右边的sum 2.在边界时讨论&…

JAVA 鼠标控制与键盘输入控制

核心类:java.awt.Robot 该类是JDK定义的电脑系统的抽象类,可以用来模拟实现鼠标点击与键盘输入等信息 简单实现一个自动抢票代码: Robot rt new Robot();//可以认为是操作间隔的停歇时间,比如等待页面加载,等弹框内容展示等 r…

vue tree禁用和多选变为单选

禁用的话和后台协调一下&#xff0c;参数中多返回一个disabled 多选变单选 在tree结构中加入一个方法 <el-treeaccordion:data"deptOptions":props"defaultProps"show-checkbox:expand-on-click-node"false":filter-node-method"filte…

windows bat 脚本实现FTP自动下载上传

windows bat 脚本实现FTP自动下载上传 1. 自动下载 # 示例&#xff1a;实现自动下载 echo Off echo open 192.168.137.102>>ftp.txt echo admin>>ftp.txt echo admin12345>>ftp.txt echo lcd D:\>>ftp.txt echo cd /admin/1>>ftp.txt echo bin…

k8s整合istio配置gateway入口、配置集群内部服务调用管理

一、 istio gateway使用demo kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata:name: ngdemo-gatewaynamespace: ssx spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:numbe…

码银送书第五期《互联网广告系统:架构、算法与智能化》

广告平台的建设和完善是一项长期工程。例如&#xff0c;谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目&#xff0c;而直到20年后的今天&#xff0c;谷歌展示广告平台仍在持续创新和提升。广告平台是负有营收责任的复杂在线平台&#xff0c;对其进行任何改动…

Mysql—修改用户密码(重置密码)

Mysql—修改用户密码&#xff08;重置密码&#xff09; 1、登录mysql 1 2 [rootlocalhost ~]# mysql -uroot -p123456 [rootlocalhost ~]# mysql -hlocalhost -uroot -p123456 如果忘记密码&#xff0c;则跳过MySQL的密码认证过程。步骤如下&#xff1a; 修改Mysql配置文件…

TypeScript教程(三)变量声明

一、变量声明 变量是一种使用方便的占位符&#xff0c;用于引用计算机内存地址&#xff0c;可以将变量看做存储数据的容器 命名规则&#xff1a; 1.变量名称可以包含数字和字母 2.除了下划线_和美元$符号外&#xff0c;不能包含其他特殊字符&#xff0c;包括空格 3.变量名…

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装 受限于每篇文章最多只能贴9张图的限制&#xff0c;这个教程被拆分成了多篇文章连载发布&#xff0c;完整目录结构如下图x所示。后续会发布完整教程的pdf文件&#xff0c;敬请期待。 图x 完整教程文档…