当前位置: 首页 > news >正文

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

目录

队列的概念

画图理解队列

代码图理解

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

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);
}

 

相关文章:

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

目录 队列的概念 画图理解队列 代码图理解 代码展示(注意这个队列是单链表的结构实现) Queue.h(队列结构) Queue.c(函数/API实现) main.c(测试文件) 队列的概念 队列&#xff08;Queue&#xff09;是一种基础的数据结构&#xff0c;它遵循先进先出&#xff08;First In …...

python文件名通常以什么结尾

python文件后缀一般有两个&#xff0c;分别是.py和.pyw。视窗用 python.exe 运行 .py&#xff0c;用 pythonw.exe 运行 .pyw 。 这纯粹是因为安装视窗版Python时&#xff0c;扩展名 .py 自动被登记为用 python.exe 运行的文件&#xff0c;而 .pyw 则被登记为用 pythonw.exe 运…...

前端javascript 中 JSON.parse() 的作用

1.解析 JSON 字符串 JSON.parse({"name": "tom"}) // {"name": "tom"} JSON.parse([1,2,3]) // [1,2,3] 2.转换成数字 JSON.parse(12) // 12 3.转换成布尔值 JSON.parse(false) // false...

【Linux学习】进程基础API

下面是有关进程基础API的相关介绍&#xff0c;希望对你有所帮助&#xff01; 小海编程心语录-CSDN博客 目录 1. 僵尸进程与孤儿进程 1.1 孤儿进程 1.2 僵尸进程 2. 监视子进程 2.1 wait() 2.2 waitpid() 3. 执行新程序 exec族函数 4. 守护进程 1. 僵尸进程与孤儿进程…...

音视频及H264/H256编码相关原理

一、音视频封装格式原理&#xff1a; 我们播放的视频文件一般都是用一种封装格式封装起来的&#xff0c;封装格式的作用是什么呢&#xff1f;一般视频文件里不光有视频&#xff0c;还有音频&#xff0c;封装格式的作用就是把视频和音频打包起来。 所以我们先要解封装格式&#…...

查看cpu进程数

import multiprocessing from multiprocessing import Pool# 导入 Pool 允许你创建一个进程池 # 进程池是一组工作进程&#xff0c;它们可以并行地执行多个任务# multiprocessing.cpu_count(): 返回当前机器上的CPU核心数 sum_cpu multiprocessing.cpu_count()use_cpu max(1,…...

MySQL优化篇

文章目录 库表结构优化1.规范和反规范化2.数据类型选择3.主键类型选择 索引优化聚簇索引和辅助索引&#xff08;一切的起源&#xff09;复合索引 查询优化 库表结构优化 1.规范和反规范化 表设计之间性能和数据完整性&#xff0c;耦合和解耦合之间的取舍。 进而考虑是要冗余…...

Python3 笔记:部分专有名词解释

1、python 英 /ˈpaɪθən/ 这个词在英文中的意思是蟒蛇。但据说Python的创始人Guido van Rossum&#xff08;吉多范罗苏姆&#xff09;选择Python这个名字的原因与蟒蛇毫无关系&#xff0c;只是因为他是“蒙提派森飞行马戏团&#xff08;Monty Python&#xff07;s Flying Ci…...

javaAPI文档中文版(JDK11在线版)java帮助文档,掌握文档java学习事半功倍。

&#x1f320;个人主页 : 赶路人- - &#x1f30c;个人格言 : 要努力成为梧桐&#xff0c;让喜鹊在这里栖息。 要努力成为大海&#xff0c;让百川在这里聚积。 11.by,prep.凭&#xff0c;靠&#xff0c;沿 [baɪ] 12.press,v.按&#xff0c;压 [prɛs] 菜鸟教程javaAPI文档中文…...

移动端适配:vw适配方案

vw (Viewport Width) 是一种长度单位&#xff0c;代表视口宽度的百分比。1vw 等于视口宽度的1%。在网页设计和前端开发中&#xff0c;vw 单位常用于实现响应式设计和屏幕适配&#xff0c;尤其是针对不同尺寸和分辨率的移动设备。 为什么使用vw适配&#xff1f; 响应式: 使用v…...

实战Java虚拟机-实战篇

一、内存调优 1.内存溢出和内存泄漏 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&#xff0c;这种情况就称之为内存泄漏。内存泄漏绝大…...

力扣:349. 两个数组的交集

349. 两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; …...

深度学习之基于Matlab的BP神经网络交通标志识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着智能交通系统&#xff08;ITS&#xff09;的快速发展&#xff0c;交通标志识别&#xff0…...

Linux备份服务及rsync企业备份架构(应用场景)

备份服务概述 备份服务:需要使用到脚本,打包备份,定时任务. 备份服务:rsyncd服务,不同主机之间数据传输. 特点&#xff1a; rsync是个服务也是命令使用方便&#xff0c;具有多种模式传输数据的时候是增量传输 增量与全量&#xff1a; 全量 &#xff1a;无论多少数据全部推…...

用手机打印需要下载什么软件

在快节奏的现代生活中&#xff0c;打印需求无处不在&#xff0c;无论是工作文件、学习资料还是生活小贴士&#xff0c;都可能需要一纸呈现。然而&#xff0c;传统的打印方式往往受限于时间和地点&#xff0c;让人倍感不便。今天&#xff0c;就为大家推荐一款便捷又省钱的手机打…...

Storm在Java中的应用

Storm在Java中的应用主要体现在构建分布式实时计算系统&#xff0c;用于处理大数据流。以下是一些Storm在Java中的具体应用场景和步骤&#xff1a; 实时数据处理&#xff1a;Storm可以实时地接收、处理和传输数据。对于需要快速响应的应用场景&#xff0c;如在线广告、金融交易…...

Java 面试题日常练习

### 基础知识 1. **什么是 JVM&#xff1f;解释其架构。** - JVM&#xff08;Java Virtual Machine&#xff09;是 Java 程序的运行时环境。其架构包括类加载器子系统、运行时数据区&#xff08;堆、栈、本地方法栈、PC 寄存器、方法区&#xff09;、执行引擎和本地方法接口…...

卷爆短剧出海:五大关键,由AIGC重构

短剧高温下&#xff0c;谈谈AIGC的助攻路线。 短剧&#xff0c;一个席卷全球的高温赛道。 以往只是踏着霸总题材&#xff0c;如今&#xff0c;内容循着精品化、IP化的自然发展风向&#xff0c;给内容、制作、平台等产业全链都带来新机&#xff0c;也让短剧消费走向文化深处&am…...

LLM实战:当网页爬虫集成gpt3.5

1. 背景 最近本qiang~关注了一个开源项目Scrapegraph-ai&#xff0c;是关于网页爬虫结合LLM的项目&#xff0c;所以想一探究竟&#xff0c;毕竟当下及未来&#xff0c;LLM终将替代以往的方方面面。 这篇文章主要介绍下该项目&#xff0c;并基于此项目实现一个demo页面&#x…...

Flutter底部导航栏和顶部Tab切换完整代码

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 目前市场上绝大部分App的布局结构基本统一&#xff1a;底部导航顶部导航&#xff0c;底部导航页里嵌套顶部导航栏&#xff0c;顶部导航页里嵌套图文…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...