数据结构之队列详解(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.rhkb.cn/news/272128.html

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

相关文章

简单题我重拳出击

有请第一位嘉宾&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 n…

【golang】Windows与Linux交叉编译保姆级教程

【golang】Windows与Linux交叉编译 大家好 我是寸铁&#x1f44a; 总结了一篇【golang】Windows与Linux交叉编译的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 今天寸铁想将Windows中的程序部到Linux下跑&#xff0c;我们知道在从Windows与Linux下要进行交叉编译…

Swift SwiftUI 学习笔记 2024

Swift SwiftUI 学习笔记 2024 一、资源 视频资源 StanfordUnivercity 公开课 2023: https://cs193p.sites.stanford.edu/2023 教程 Swift 初识&#xff1a;基础语法&#xff1a;https://docs.swift.org/swift-book/documentation/the-swift-programming-language/guidedtour/…

Util工具类功能设计与类设计(http模块一)

目录 类功能 类定义 类实现 编译测试 Split分割字符串测试 ReadFile读取测试 WriteFile写入测试 UrlEncode编码测试 UrlDecode编码测试 StatuDesc状态码信息获取测试 ExtMime后缀名获取文件mime测试 IsDirectory&IsRegular测试 VaildPath请求路径有效性判断测…

IPSEC VPPN实验

实验背景&#xff1a;FW1和FW2是双机热备的状态。 实验要求&#xff1a;在FW和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置&#xff08;由于是双机热备状态&#xff0c;所以FW1和FW2只需要配置FW1主设备即可&…

docker学习进阶

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

数据库系统概念(第一周)

⚽前言 &#x1f3d0;四个基本概念 一、数据 定义 种类 特点 二、数据库 三、数据库管理系统&#xff08;DBMS&#xff09; 四、 数据库系统&#xff08;DBS&#xff09; &#x1f3c0;数据库系统和文件系统对比 文件系统的弊端 &#x1f94e;数据视图 数据抽象 …

【uniapp】uniapp小程序中实现拍照同时打开闪光灯的功能,拍照闪光灯实现

一、需求前提 特殊场景中&#xff0c;需要拍照的同时打开闪光灯&#xff0c;&#xff08;例如黑暗场景下的设备维护巡检功能&#xff09;。 起初我是用的uviewui中的u-upload组件自带的拍照功能&#xff0c;但是这个不支持拍照时打开闪光灯&#xff0c;也不支持从通知栏中打开…

Svg Flow Editor 原生svg流程图编辑器(一)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; 效果展示 项目概述 svg flow editor 是一款流程图编辑器&#xff0c;提供了一系列流程图交互、编辑所必需的功能&#xff0c;支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER 图、…

JavaEE企业开发新技术

目录 2.1 Class对象基本概念 1、概念 2.2 Class对象的获取方式 2.3基本数据类型的Class对象 1、概念 2.4 反射的基本概念 概念 2.5 Class对象的基本使用-1 2.6 Class对象的基本使用-2 newInstance()和new()区别&#xff1a; 2.1 Class对象基本概念 1、概念 反射的…

ubuntu22.01安装及配置

前言 本次安装基于VMware Pro 16进行安装。 ubuntu版本&#xff1a;ubuntu-22.04.3-live-server-amd64.iso 1、下载 1.1官网下载 https://ubuntu.com/download 1.2、清华大学镜像网站下载 https://mirrors.tuna.tsinghua.edu.cn/ 进入网站后搜索ubuntu&#xff0c;选择ubu…

初阶数据结构之---二叉树的顺序结构-堆

引言 今天要讲的堆&#xff0c;不是操作系统虚拟进程地址空间中&#xff08;malloc&#xff0c;realloc等开空间的位置&#xff09;的那个堆&#xff0c;而是数据结构中的堆&#xff0c;它们虽然名字相同&#xff0c;却是截然不同的两个概念。堆的底层其实是完全二叉树&#x…

AIOPS:Zabbix结合讯飞星火做自动化告警+邮件通知并基于人工智能提供解决方案

目前Zabbix官方已经提供Zabbix+ChatGPT的解决方案 ChatGPT一周年,你充分利用了吗?Zabbix+ChatGPT,轻松化解告警! 但是由于需要魔法等其他因素,比较不稳定,遂决定使用国内模型,这里我挑选的是讯飞星火,基于我之前的文档,在此基础上通过Zabbix的告警脚本实现调用AI模型…

C# OpenCvSharp DNN FreeYOLO 人脸检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 人脸检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…

uniapp富文本编辑-editor-vue2-vue3-wangeditor

前言 除了“微信小程序”&#xff0c;其他小程序想要使用editor组件实现富文本编辑&#xff0c;很难vue3项目 官方组件editor&#xff0c;在初始化时有点麻烦&#xff0c;建议搭配第三方组件wangeditor 写在前面 - editor组件缺少editor-icon.css 内容另存为editor-icon.css…

Java基础-内部类

内部类 引言内部类的共性成员内部类静态内部类非静态内部类 局部内部类匿名内部类内部类的使用场景和好处 引言 Java不仅可以定义变量和方法,还可以定义类. 内部类允许你把一些逻辑相关的类组织在一起,并可以控制内部中类的可见性. 这么看来,内部类就像是代码一种隐藏机制:将类…

Postman(注册,使用,作用)【详解】

目录 一、Postman 1. Postman介绍 2. 安装Postman 3. 注册帐号再使用(可保存测试记录) 4. 创建workspace 5. 测试并保存测试记录 一、Postman postman工具可以发送不同方式的请求,浏览器只能发送get请求(所有用这个工具) 在前后端分离开发模式下&#xff0c;前端技术人员…

SVG 渐变边框在 CSS 中的应用

SVG 渐变边框在 CSS 中的应用 <template><div class"home"><div class"one"><svg width"100%" height"100%"><rect x"2" y"2" width"100%" height"100%" fill&q…

R语言自定义颜色

一、创建颜色梯度&#xff08;渐变色&#xff09; 在绘热图时&#xff0c;需要将数值映射到不同的颜色上&#xff0c;这时就需要一系列的颜色梯度colorRampPalette 函数支持自定义的创建一系列的颜色梯度。 代码示例&#xff1a; library(RColorBrewer)x <- colorRampPal…

SaulLM-7B: A pioneering Large Language Model for Law

SaulLM-7B: A pioneering Large Language Model for Law 相关链接&#xff1a;arxiv 关键字&#xff1a;Large Language Model、Legal Domain、SaulLM-7B、Instructional Fine-tuning、Legal Corpora 摘要 本文中&#xff0c;我们介绍了SaulLM-7B&#xff0c;这是为法律领域量…