数据结构之队列详解(C语言手撕)

在这里插入图片描述
在这里插入图片描述
🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生
🙈个人主页🎉:GOTXX
🐼个人WeChat:ILXOXVJE
🐼本文由GOTXX原创,首发CSDN🎉🎉🎉
🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路
🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉
————————————————

🎉文章简介:

🎉本篇文章对 用C语言实现队列 等相关知识 学习的相关知识进行分享!🎉
💕如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加
油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉
————————————————

一.队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的性质;
入队列:进行插入操作的一端称为队尾 ;
出队列:进行删除操作的一端称为队头;

在这里插入图片描述队列适合用链表来实现,入队列即尾插,出队列即头删,直接改变指针指向即可
如果用数组类实现的话,需要头删,要挪动数据,效率低;

二.队列的实现

在这里插入图片描述为了方便,可以存储一个尾指针,这样尾插的时候就不需要去找尾,提高效率;
出队的时候为头删,需要改变头指针的指向,在链表的时候我们是通过二级指针来解决的,这里用一个新的方法;即将队尾指针和队头指针存放到一个结构体中,通过传结构体指针来访问头指针和尾指;同时还可以在结构体中放一个int记录队列中有效数据的个数

typedef int QueueDateType;
typedef struct QueueNode
{struct Queue* next;    //指向下一个的位置QueueDateType val;      //存储的数据
}QNode;                     //节点的结构体typedef struct Queue
{QNode* plist;      //指向队头的指针QNode* tail;       //指向队尾的指针int size;           //有效数据的个数
}Que;  

2.1功能函数的实现

队列一般需要这样几个功能:

  1. 初始化队列
  2. 队头入数据
  3. 队尾出数据
  4. 取队头数据
  5. 取队尾数据
  6. 获取队列中有效数据个数
  7. 判断队列是否为空
  8. 队列的销毁

1.初始化队列

void QueInit(Que* pq)
{assert(pq);pq->plist = pq->tail = NULL;       //先置空处理pq->size = 0;}

2.队头入数据

void QuePush(Que* pq, QueueDateType x)
{assert(pq);QNode* newnode = (QNode* )malloc(sizeof(QNode));    //创建一个节点if (newnode == NULL){perror("malloc fail");      //判断exit(-1);}newnode->next = NULL;     //将后节点置空处理newnode->val = x;         //赋值if (pq->plist == NULL)     //队列为空{pq->plist= pq->tail = newnode;}else                        //队列不为空{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;               //有效数据个数++
}

3.队尾出数据

分为两种情况处理:
第一种:队列只有一个数据时,需要处理尾指针
第二种:队列的数据个数大于1时,不需要对尾指针进行处理

void QuePop(Que* pq)
{assert(pq);assert(pq->size);   //当队列为空时,不出数据QNode* tmp = NULL;if (pq->size==1)          //当队列的有效数据只有一个时,需要特殊处理{                          //因为出队列后,为空列表了,尾指针需要改变free(pq->plist);pq->plist = pq->tail == NULL;}else                       //队列不为空,直接头删{tmp = pq->plist->next;     //先保存下一个节点free(pq->plist);            //释放pq->plist = tmp;    }pq->size--;               //有效数据个数--;
}

4.取队头的数据

QueueDateType QueFront(Que* pq)
{assert(pq);return pq->plist->val;   //直接返回数据
}

5.取队尾的数据

QueueDateType QueBack(Que* pq)
{assert(pq);return pq->tail->val;    //直接返回数据
}

6.获取队列中有效数据个数

int QueSize(Que* pq)
{assert(pq);return pq->size;
}

7.判断队列是否为空

bool QueEmpty(Que* pq)
{assert(pq);return pq->plist;
}

8.销毁队列

bool QueEmpty(Que* pq)
{assert(pq);return pq->plist;
}

2.2总代码

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>typedef int QueueDateType;
typedef struct QueueNode
{struct Queue* next;QueueDateType val;
}QNode;typedef struct Queue
{QNode* plist;QNode* tail;int size;
}Que;void QueInit(Que* pq);
void QueDestory(Que* pq);void QuePush(Que* pq,QueueDateType x);
void QuePop(Que* pq);QueueDateType QueFront(Que* pq);
QueueDateType QueBack(Que* pq);int QueSize(Que* pq);
bool QueEmpty(Que* pq);
#include"Queue.h"void QueInit(Que* pq)
{assert(pq);pq->plist = pq->tail = NULL;pq->size = 0;}void QueDestory(Que* pq)
{assert(pq);QNode* cur = pq->plist;QNode* Next = NULL;while (cur){Next = cur->next;free(cur);cur =Next;}pq->plist = pq->tail == NULL;
}void QuePush(Que* pq, QueueDateType x)
{assert(pq);QNode* newnode = (QNode* )malloc(sizeof(QNode));    //创建一个节点if (newnode == NULL){perror("malloc fail");      //判断exit(-1);}newnode->next = NULL;     //将后节点置空处理newnode->val = x;         //赋值if (pq->plist == NULL)     //队列为空{pq->plist= pq->tail = newnode;}else                        //队列不为空{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;               //有效数据个数++
}void QuePop(Que* pq)
{assert(pq);assert(pq->size);   //当队列为空时,不出数据QNode* tmp = NULL;if (pq->size==1)          //当队列的有效数据只有一个时,需要特殊处理{                          //因为出队列后,为空列表了,尾指针需要改变free(pq->plist);pq->plist = pq->tail == NULL;}else                       //队列不为空,直接头删{tmp = pq->plist->next;     //先保存下一个节点free(pq->plist);            //释放pq->plist = tmp;    }pq->size--;               //有效数据个数--;
}QueueDateType QueFront(Que* pq)
{assert(pq);return pq->plist->val;   //直接返回数据
}
QueueDateType QueBack(Que* pq)
{assert(pq);return pq->tail->val;    //直接返回数据
}int QueSize(Que* pq)
{assert(pq);return pq->size;
}
bool QueEmpty(Que* pq)
{assert(pq);return pq->plist;
}

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

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

相关文章

ModuleNotFoundError: No module named ‘sklearn.cross_validation‘

一、问题分析 ModuleNotFoundError: No module named sklearn.cross_validation 英文先翻译一遍&#xff0c;模块未找到问题&#xff0c;这里涉及到sklearn这个模块&#xff0c;Sklearn &#xff08;全称 SciKit-Learn&#xff09;&#xff0c;是基于 Python 语言的机器学习工…

快速收集诊断信息,敏捷诊断工具obdiag应用实践——《OceanBase诊断系列》之三

1. 前言 作为OceanBase的敏捷诊断工具&#xff0c;obdiag具有以下特点&#xff1a; 部署便捷&#xff1a;提供rpm包和OBD上部署的模式&#xff0c;都能够一键部署安装。用户可以选择将其部署到集群中任意一台能连接到各个节点的设备上&#xff0c;而不仅限于OBServer节点。即…

【C++庖丁解牛】STL简介 | string容器初次见面

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1. 什么是STL2. STL的…

LeetCode_Hot100_哈希_49字母异位词分组_Python

看题目前心里随便想的&#xff1a; 这个是我第一次正式刷LeetCode的第一道题&#xff0c;我完全不懂任何的原理&#xff0c;学习数据结构也有点太久远了&#xff0c;现在都有一些忘记了&#xff0c;所以还是一点点学习吧&#xff08;嘿嘿&#xff09; 题目 给你一个字符串数…

【国产MCU】-CH32V307-独立看门狗(IWDG)

独立看门狗(IWDG) 文章目录 独立看门狗(IWDG)1、独立看门狗介绍2、独立看门狗驱动API介绍3、独立看门狗使用实例在CH32V307中,独立看门狗(IWDG)是一个自由运行的12 位递减计数器,支持7 种分频系数。由一个内部独立的40KHz的RC振荡器(LSI)提供时钟;因为LSI 独立于主时…

2024年AI辅助研发趋势:AI辅助科技发展

目录 前言 一、AI辅助研发的技术进展 &#xff08;一&#xff09;深度学习在研发中的应用 &#xff08;二&#xff09;强化学习在研发中的应用 &#xff08;三&#xff09;生成模型在研发中的应用 &#xff08;四&#xff09;技术如何推动研发效率的提升 二、2024人工智…

华为设备小型园区网方案(有线+无线+防火墙)

&#xff08;一&#xff09;配置有线部分 1.配置LSW2 &#xff08;1&#xff09;创建相关vlan [LSW2]vlan batch 10 3000 &#xff08;2&#xff09;配置连接LSW1的Eth-Trunk1&#xff0c;透传VLAN 10 3000 [LSW2]int Eth-Trunk 1 [LSW2-Eth-Trunk1]port link-type trunk [LSW2…

神经网络的矢量化,训练与激活函数

我们现在再回到我们的神经元部分&#xff0c;来看我们如何用python进行正向传递。 单层的正向传递&#xff1a; 我们回到我们的线性回归的函数。我们每个神经元通过上述的方法&#xff0c;就可以得到我们的激发值&#xff0c;从而可以继续进行下一层。 我们用这个方法就可以得…

已解决com.alibaba.com.caucho.hessian.io.HessianProtocolException异常的正确解决方法,亲测有效!!!

已解决com.alibaba.com.caucho.hessian.io.HessianProtocolException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 在使用基于Hessian协议进行远程过程调用&#xff08;RPC&am…

AES加密——AES加密原理与C++实现AES加密

概述 在密码学中&#xff0c;加密算法被分为两种主要类型&#xff1a;单向加密和双向加密。单向加密算法是不可逆的&#xff0c;主要用于数据完整性验证和密码存储&#xff0c;其中包括MD5、SHA等摘要算法。双向加密算法允许加密和解密过程&#xff0c;分为对称加密和非对称加…

Viper反序列化解析字段不成功问题

问题背景 通过viper解析文件内容映射config一直失败&#xff0c;相关代码如下 type Config struct {DBConf *DBConf toml:"db"RedisConf *RedisConf toml:"redis"WebConfig *WebConfig toml:"app" }type DBConf struct {Read struct {Ds…

通过一篇文章带你玩转git和GitHub

Git和Github的基本用法 前言一、Git和Github的基本用法背景下载安装安装 git for windows安装 tortoise gitgit安装过程中的一些选项 tortoise git汉化教程下载tortoise git汉化安装包安装tortoise git汉化安装包 三、使用 Github 创建项目注册账号创建项目下载项目到本地 四、…

c++ primer中文版第五版作业第十一章

仓库地址 文章目录 11.111.211.311.411.511.611.711.811.911.1011.1111.1211.1311.1411.1511.1611.1711.1811.1911.2011.2111.2211.2311.2411.2511.2611.2711.2811.2911.3011.3111.3211.3311.3411.3511.3611.3711.38 11.1 map中的元素是按 关键字 和 值 的方式成对保存的&…

Excel转pdf

1、excel-内存值--Workbook 转pdf /** * excel To pdf * * param outPath 输出路径 * param workbook excel-内存值 * throws IOException */ public static void excelToPdf(String outPath,Workbook workbook) throws IOException, DocumentException { Document documentnul…

突然发现一个很炸裂的平台!

平时小孟会开发很多的项目&#xff0c;很多项目不仅开发的功能比较齐全&#xff0c;而且效果比较炸裂。 今天给大家介绍一个我常用的平台&#xff0c;因含低代码平台&#xff0c;开发相当的快。 1&#xff0c;什么是低代码 低代码包括两种&#xff0c;一种低代码&#xff0c;…

探索JavaScript宝库:打开基础知识与实用技能之门(数据类型与变量+ 条件与循环+函数与模块+DOM+异常+ES6)

目录 [TOC](目录)一、JavaScript的基础知识1. 数据类型与变量2. 条件与循环3. 函数与模块 二、JavaScript的实用技能1. DOM操作与事件处理2. 异步编程与Promise3. ES6语法 三、JavaScript的重要性与应用场景结语 欢迎阅读本篇博客&#xff0c;我们将深入探讨JavaScript语言的基…

你知道利用神秘顾客工具提升营业厅服务水平

利用神秘顾客工具提升营业厅服务水平是一个有效的策略&#xff0c;以下是一些建议&#xff1a; 1、确定评估指标和标准&#xff1a;在利用神秘顾客工具进行调查之前&#xff0c;需要明确评估服务的指标和标准。这些指标应该根据营业厅的服务特点和重要性&#xff0c;例如服务态…

Java中的常用类(三)

一、正则表达式 正则表达式 regex&#xff0c;全称Regular Expression。正则表达式是一种规则&#xff08;模式&#xff09;匹配语法 可以使用一些正则表达式中的特殊符号来定义一种规则&#xff0c;然后用此规则匹配某个字符&#xff0c;如果字符串与规则匹配则返回true&…

【Docker1】Docker镜像和容器基本操作

Docker基本管理一、Docker概述1、为什么要用到容器&#xff1f;2、Docker是什么&#xff1f;3、Docker的设计宗旨4、容器的优点5、Docker与虚拟机的区别6、Docker的三大核心概念 二、安装Docker1、yum安装2、二进制安装 三、Docker镜像创建与操作1、Docker 镜像操作1.1 搜索镜像…

【JavaEE进阶】Spring中事务的实现

文章目录 &#x1f343;前言&#x1f334;事务简介&#x1f6a9; 什么是事务?&#x1f6a9;为什么需要事务?&#x1f6a9;事务的操作 &#x1f340;Spring 中事务的实现&#x1f6a9;Spring 编程式事务&#x1f6a9;Spring声明式事务Transactional&#x1f6a9;Transactional…