数据结构-队列(带图详解)

目录

队列的概念

画图理解队列

代码图理解

代码展示(注意这个队列是单链表的结构实现)

Queue.h(队列结构)

Queue.c(函数/API实现)

main.c(测试文件)


队列的概念

队列(Queue)是一种基础的数据结构,它遵循先进先出(First In First Out, FIFO)的原则。这意味着最早进入队列的元素也将是最先离开队列的元素。队列常被比喻为现实生活中的排队场景,比如在超市收银台前排队结账,先到的人先结账。

队列有两个主要的操作:

  1. 入队(Enqueue):将一个元素添加到队列的末尾。这相当于一个人加入到队伍的最后面。
  2. 出队(Dequeue):从队列的前端移除一个元素,并返回该元素。这相当于队伍最前面的人完成相应操作后离开队伍。

画图理解队列

        这就是队列的一个基本结构,队尾入队,队头出队。在生活中也有这样的结构,请个看例图(希望可以给你带来印象):

生活中队列的例子非常普遍,以下是一些典型的实例:

  1. 超市结账:顾客在超市收银台前排队等待付款,先到的顾客先完成结账离开,后来的顾客依次跟进。

  2. 银行服务窗口:客户在银行的服务窗口前排队办理业务,遵循先来先服务的原则。

  3. 公共交通:在公交站、火车站或地铁站的候车队伍,乘客按照到达的先后顺序上车。

  4. 餐厅排队:在餐厅,特别是快餐店,顾客排队等待点餐和取餐,先排队的顾客先完成点餐流程。

  5. 打印机任务队列:在办公室,多个人提交打印任务时,打印机会按照任务提交的顺序依次执行打印。

  6. 医院挂号:病人在医院挂号处排队等待挂号,通常也是按照到达顺序进行服务。

  7. 网上购票系统:虽然看不见实体队伍,但在高峰时段购买热门活动或交通工具票务时,请求会被按接收顺序处理。

  8. ATM机取款:人们在ATM机前排队取现金,每个人完成交易后下一个人才能使用。

代码图理解

代码展示(注意这个队列是单链表的结构实现)

数据结构:单链表-CSDN博客文章浏览阅读1.6k次,点赞36次,收藏15次。链表是一种基本的数据结构,它用于存储一系列元素(节点),每个节点不仅包含数据元素,还包含一个指向下一个节点的指针。在链表中,数据并非连续地存储在内存中,而是通过每个节点的指针链接起来形成一个逻辑上的线性序列通过前面我们学习的顺序表我们现在延伸一个链表我们会发现顺序表的一些缺点。https://blog.csdn.net/2302_78381559/article/details/137829309

Queue.h(队列结构)

#pragma once
/*--头文件--*/
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int DataType;
//创建队列结构
typedef struct QueueNode
{struct QueueNode* Next;DataType val;
}QueueNode;
//创建一个结构体来确定头/尾,可以避免使用二级指针,也可以用哨兵来避免使用二级指针
typedef struct Queue {QueueNode* head;//头QueueNode* tail;//尾int size;//计数
}Queue;/*--函数实现--*/
//初始化
void Q_Init(Queue* p);
//入队
void Q_Push(Queue* p, DataType x);
//出队
void Q_Pop(Queue* p);
//节点数
int Q_Size(Queue* p);
//获取头部
DataType Q_Front(Queue* p);
//获取尾部
DataType Q_Back(Queue* p);
//判断是否为空
bool Q_Empty(Queue* p);
//销毁
void Q_Destroy(Queue* p);

Queue.c(函数/API实现)

#define _CRT_SECURE_NO_WARNINGS 1
//函数实现
#include"Queue.h"//初始化
void Q_Init(Queue* p) {//断言assert(p);//初始化结构体p->head = NULL;p->tail = NULL;p->size = 0;
}//入队
void Q_Push(Queue* p, DataType x) {//开辟一个节点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL)//判断是否开辟成功{assert("malloc");return;}//进行插入操作newnode->Next = NULL;newnode->val = x;if (p->tail == NULL){p->head = p->tail = newnode;}else{p->tail->Next = newnode;p->tail = newnode;//更新tail的指向}p->size++;//push一下节点个数++
}//出队
void Q_Pop(Queue* p) {assert(p);assert(p->size);//节点不能为空//进行出队if (p->head->Next == NULL)//一个节点{free(p->head);p->head = p->tail = NULL;}else//多个节点{QueueNode* tmp = p->head->Next;//用临时变量存储head的下一个节点free(p->head);//释放head的节点p->head = tmp;//在更新head指向}p->size--;//pop一个节点个数--
}//节点数
int Q_Size(Queue* p) {assert(p);assert(p->size);return p->size;
}//获取头部
DataType Q_Front(Queue* p) {assert(p);assert(p->size);//直接返回head的元素return p->head->val;
}
//获取尾部
DataType Q_Back(Queue* p) {assert(p);assert(p->size);//直接返回tail的元素return p->tail->val;
}//判断是否为空
bool Q_Empty(Queue* p) {assert(p);//return p->size == 0;return !p->size;
}
//销毁
void Q_Destroy(Queue* p) {assert(p);QueueNode* cur = p->head;while (cur){//存储下一个位置QueueNode* tmp = cur->Next;free(cur);cur = tmp;}//指针制空p->head = p->tail = NULL;p->size = 0;
}

main.c(测试文件)

#define _CRT_SECURE_NO_WARNINGS 1
//测试
#include"Queue.h"
#if 0
int main1() {Queue s1;Q_Init(&s1);Q_Push(&s1, 1);Q_Push(&s1, 2);Q_Push(&s1, 3);Q_Push(&s1, 4);while (!Q_Empty(&s1)){printf("%d ", Q_Front(&s1));Q_Pop(&s1);}Q_Destroy(&s1);
}
#endif // 0int main() {//测试一个数据Queue s1;Q_Init(&s1);Q_Push(&s1, 1);Q_Push(&s1, 2);Q_Push(&s1, 3);while (!Q_Empty(&s1)){printf("%d ", Q_Front(&s1));Q_Pop(&s1);}Q_Destroy(&s1);
}

 

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

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

相关文章

二十八、openlayers官网示例Data Tiles解析——自定义绘制DataTile源数据

官网demo地址&#xff1a; https://openlayers.org/en/latest/examples/data-tiles.html 这篇示例讲解的是自定义加载DataTile源格式的数据。 先来看一下什么是DataTile&#xff0c;这个源是一个数组&#xff0c;与我们之前XYZ切片源有所不同。DataTile主要适用于需要动态生成…

算法简单笔记2

5月26号&#xff0c;之前学了两天算法烦了&#xff0c;去学了几天鸿蒙&#xff0c;今天又回来看一下算法&#xff0c;距离6月1日国赛还有6天&#xff0c;哈哈真是等死咯...... 一、蓝桥杯第13届国赛第1题填空题&#xff1a;重合次数 &#xff08;半难不难&#xff0c;写编程难…

探索演进:了解IPv4和IPv6之间的区别

探索演进&#xff1a;了解IPv4和IPv6之间的区别 在广阔的互联网领域中&#xff0c;设备之间的通信依赖于一组独特的协议来促进连接。前景协议中&#xff0c;IPv4&#xff08;Internet 协议版本 4&#xff09;和 IPv6&#xff08;Internet 协议版本 6&#xff09;是数字基础设施…

内存泄漏案例分享3-view的内存泄漏

案例3——view内存泄漏 前文提到&#xff0c;profile#Leaks视图无法展示非Activity、非Fragment的内存泄漏&#xff0c;换言之&#xff0c;除了Activity、Fragment的内存泄漏外&#xff0c;其他类的内存问题我们只能自己检索hprof文件查询了。 下面有一个极佳的view内存泄漏例子…

OrangePi AIpro开箱测评

OrangePi AIpro(8T) 香橙派联合华为精心打造&#xff0c;建设人工智能新生态 章节一&#xff1a;引言 1.1 背景 香橙派&#xff08;OrangePi&#xff09;是深圳市迅龙软件有限公司旗下开源产品品牌&#xff0c;迅龙软件成立于2005年&#xff0c;是全球领先的开源硬件和开源软…

初识C语言——第二十九天

数组 本章重点 1.一维数组的创建和初始化 数组的创建 注意事项&#xff1a; 1.一维由低数组在内存中是连续存放的&#xff01; 2.随着数组下标的增长&#xff0c;地址是由低到高变化的 2.二维数组的创建和初始化 注意事项&#xff1a; 1.二维数组在内存中也是连续存放的&am…

YOLOv8+PyQt5面部表情检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.资源包含可视化的面部表情检测系统&#xff0c;基于最新的YOLOv8训练的面部表情检测模型&#xff0c;和基于PyQt5制作的可视化面部表情检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的八类面部表情&#xff1a…

211大学计算机专业不考408,新增的交叉专业却考408!南京农业大学计算机考研考情分析!

南京农业大学信息科技学院可追溯至1981年成立的计算中心和1985年筹建的农业图书情报专业。1987年设立了农业图书情报系&#xff0c;1993 年农业图书情报系更名为信息管理系&#xff0c;本科专业名称也于1999年更名为信息管理与信息系统专业。1994年计算中心开始招收计算机应用专…

开源网页视频会议,WebRTC音视频功能比较

1. 概述 OpenAI 发布了新一代旗舰生成模型 GPT-4o,这是一款真正的多模态大模型,可以「实时对音频、视觉和文本进行推理」。 支持与 AI 实时语音对话,且响应时间达到毫秒级;交互中可识别人类情绪并以相应的情感做出回应;多语言能力的提升,WebRTC 成为大模型关键能力。 视频会议…

theharvester一键收集域名信息(KALI工具系列十)

目录 1、KALI LINUX简介 2、theharvester工具简介 3、在KALI中使用theharvester 3.1 用搜索引擎扫描 3.2 扫描并输出结果 3.3 扫描某域名下的所有账号 3.4 使用所有的搜索引擎扫描 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&…

【Docker学习】详细讲解docker ps

docker ps是我们操作容器次数最多的命令之一&#xff0c;但我们往往使用docker ps或是docker ps -a&#xff0c;对于该命令的其它选项&#xff0c;我们关注比较少。那么这一讲&#xff0c;我给大家详细讲讲该命令的全部方法。 命令&#xff1a; docker container ls 描述&am…

前后端项目部署和解决跨域

文章目录 一.前端项目部署1.1 上传前端文件1.2 项目部署1.3 解决跨域1.3.1 什么是跨域1.3.2 配置文件 二.后端项目部署2.1 上传后端文件2.2 项目部署2.3 解决跨域 一.前端项目部署 1.1 上传前端文件 站点创建好了&#xff0c;进入到站点的目录。 然后把它默认的文件删掉。 你…

2024.5.22 关于 SpringCloud —— Nacos 配置管理

目录 Nacos 配置统一管理 Nacos 配置热部署 Nacos 多环境配置共享 配置优先级 Nacos 配置统一管理 实例理解 我们想要利用 Nacos 在 user-service 的 application.yml 配置文件中新增配置项此处我们将新增配置日期格式为 yyyy-MM-dd HH:mm:ss下图为新增 Nacos 配置统一管理…

Redis篇 String

String概念和set,get扩充 一. String类型的基本介绍二. String中set,get方法扩充 一. String类型的基本介绍 redis中所有的key都是字符串类型的,但是value的类型差异很大. redis中的字符串,直接就是二进制方式存储的,可以存储整数,二进制数据 文本数据,Json,xml还有音频等. 二.…

工作中写单片机代码,与学校里有什么不同?

来聊聊我的经历&#xff0c;提供几个提升方向&#xff0c;亲测有效&#xff0c;希望能让你少走几年弯路。 10几年前&#xff0c;还没参加工作的时候&#xff0c;主要是玩玩开发板&#xff0c;也接触不到实际产品的代码&#xff0c;很好奇那些产品级的代码是怎样的。 第一份工作…

06_Tomcat

文章目录 Tomcat1.概念2.Tomcat安装3.Tomcat项目结构4.标准web项目结构5.Tomcat部署项目方式6.IDEA关联Tomcat6.1 构建tomcat和idea关联6.2 使用idea创建一个Javaweb工程6.3 使用idea将工程**构建**成一个app6.4 使用idea将构建好的app**部署**到tomcat中 Tomcat 1.概念 Tomc…

进程信号(2)

一、信号的处理 进程对应信号的处理的一般步骤就是&#xff1a;先去遍历pending位图&#xff0c;找到比特位为1的位置对应的信号&#xff0c;然后再去检测block位图对应位置的比特位是否为1。若不为1&#xff0c;就hander表的对应位置去调用信号的处理动作函数&#xff0c;若为…

JS入门学习

JS JavaScript是一门解释型的脚本语言&#xff0c;其是弱类型的&#xff0c;对变量的数据类型不做严格的要求&#xff0c;变量的类型可以在运行过程中变化 JavaScript能改变HTML内容&#xff0c;属性&#xff0c;样式 大纲 使用方式变量运算符数组JS函数自定义对象事件补充 …

mysql中InnoDB的表空间--独立表空间

大家好&#xff0c;上篇文章我们在讲mysql数据目录的时候提到了表空间这个名词&#xff0c;它是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ib…