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

初阶数据结构【队列及其接口的实现】

目录

  • 前言
  • 一、队列的概念及结构
  • 二、队列的实现方式
  • 三、队列的实现
    • 3.1 基本结构
    • 3.2 队列基本功能接口
      • 初始化队列
      • 销毁队列
    • 3.3 入队列接口
    • 3.4 出队列接口
    • 3.5 队列的其它接口
      • 获取队列头部元素
      • 获取队列队尾元素
      • 检测队列是否为空
      • 获取队列中有效元素个数
    • 3.6 测试
  • 总结


前言

上一期我们讲到了栈,这期我们继续讲解与其相似的结构——队列


一、队列的概念及结构

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

在这里插入图片描述

二、队列的实现方式

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些;

因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

在这里插入图片描述

三、队列的实现

3.1 基本结构

由于这里我们用链表实现队列的结构,所以我们先要创建链表节点的结构体:

typedef struct QueueNode
{QDataType _data;struct QueueNode* _next;
}QueueNode;

我们再创建队列结构体:

typedef struct Queue
{QueueNode* _head;QueueNode* _tail;
}Queue;

我们通过这样结构体来改变里面的_head或_tail指针的值就可以避免传二级指针;

3.2 队列基本功能接口

初始化队列

// 初始化队列
void QueueInit(Queue* q)
{assert(q);q->_head = NULL;q->_tail = NULL;
}

销毁队列

// 销毁队列
void QueueDestroy(Queue* q)
{assert(q);QueueNode* cur = q->_head;while (cur){QueueNode* next = cur->_next;free(cur);cur = next;}q->_head = NULL;q->_tail = NULL;
}

3.3 入队列接口

注:由于队列只有这个接口需要创建节点,所以我们不再写创建节点接口;

这个接口我们要考虑队列为空的情况:
在这里插入图片描述

// 队尾入队列
void QueuePush(Queue* q, QDataType x)
{assert(q);QueueNode* newnode = (QDataType*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc");exit(-1);}newnode->_data = x;newnode->_next = NULL;if (q->_head == NULL) //当队列为空时{q->_head = newnode;q->_tail = newnode;}else{q->_tail->_next = newnode;q->_tail = newnode;}
}

3.4 出队列接口

这个接口我们要注意当只有一个节点的时候,删除后防止_tail为野指针,所以也要将其置空;
在这里插入图片描述

// 队头出队列
void QueuePop(Queue* q)
{assert(q);assert(q->_head->_next != NULL); //防止队列为空QueueNode* next = q->_head->_next;free(q->_head);q->_head = next;if (q->_head == NULL){q->_tail = NULL;}
}

3.5 队列的其它接口

获取队列头部元素

QDataType QueueFront(Queue* q)
{assert(q);assert(q->_head);return q->_head->_data;
}

获取队列队尾元素

QDataType QueueBack(Queue* q)
{assert(q);assert(q->_tail);return q->_tail->_data;
}

检测队列是否为空

// 检测队列是否为空,如果为空返回非零结果1,如果非空返回0 
QDataType QueueEmpty(Queue* q)
{assert(q);return q->_head == NULL ? 1 : 0;
}

获取队列中有效元素个数

QDataType QueueSize(Queue* q)
{assert(q);QueueNode* cur = q->_head;QDataType size = 0;while (cur){size++;cur = cur->_next;}return size;
}

3.6 测试

void QueueTest()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);printf("%d ", QueueFront(&q));QueuePop(&q);QueuePush(&q, 3);QueuePush(&q, 4);//遍历while (!QueueEmpty(&q)){printf("%d ", QueueFront(&q));QueuePop(&q);}printf("\n");QueueDestroy(&q);
}

测试结果:
在这里插入图片描述
与预想结果一致,符合;


总结

这期我们用C语言实现了队列的基本操作,我们发现队列与栈有很多相似的地方,在实际应用中我们灵活运用;下期见;
26考研加油!


相关文章:

初阶数据结构【队列及其接口的实现】

目录 前言一、队列的概念及结构二、队列的实现方式三、队列的实现3.1 基本结构3.2 队列基本功能接口初始化队列销毁队列 3.3 入队列接口3.4 出队列接口3.5 队列的其它接口获取队列头部元素获取队列队尾元素检测队列是否为空获取队列中有效元素个数 3.6 测试 总结 前言 上一期我…...

dockerfile1.0

docker的数据卷 docker file ------------- 自动自定义镜像 docker的数据卷: 容器与宿主机之间,或者容器和容器之间的数据共享(目录) 创建容器的时候,通过指定目录,实现容器于宿主机之间,或…...

CES 2025|全面拥抱端侧AI,美格智能在CES发布系列创新成果

要点: ▶ 在AI机器人领域,以高算力AI模组助力发布“通天晓”人形机器人和2款全新微小型AI机器人 ▶ 在AI硬件领域,发布消费级AI智能体产品——AIMO,引领个人专属的大模型时代 ▶ 在5G通信领域,发布全新5GWiFi-7 CPE…...

【9.1】Golang后端开发系列--Gin快速入门指南

文章目录 一、引言 🌟二、Gin 框架概述 📖(一)什么是 Gin(二)为什么选择 Gin 三、安装 Gin 框架 📦(一)安装 Go 语言环境(二)使用 Go Modules 安装…...

电商系统,核心通用架构案例设计方案浅析

文章目录 一、用户系统案例设计1、用户信息的存储方案2、用户注册确保唯一3、用户数据合并方案4、用户敏感信息加密存储5、数据传输安全性6、多用户数据隔离性7、防止恶意注册8、用户好友关系存储方案9、用户登录token方案10、会员优先处理设计 二、网关系统设计1、网关的功能2…...

易飞ERP 9.2 安装包 百度云盘 下载

易飞9.2是鼎捷数智依托四十多年实践经验,面向中小企业的全面ERP解决方案‌。 以下是关于易飞9.2的详细介绍: ‌发布与更新‌: ‌发布时间‌:易飞V9.2新版发布于2023年9月。 ‌核心功能‌: ‌便捷高效‌&#xff1…...

3D目标检测数据集——Waymo数据集

Waymo数据集簡介 发布首页:https://waymo.com/open/ 论文:https://openaccess.thecvf.com/content_CVPR_2020/papers/Sun_Scalability_in_Perception_for_Autonomous_Driving_Waymo_Open_Dataset_CVPR_2020_paper.pdf github:https://github.…...

LSA更新、撤销

LSA的新旧判断&#xff1a; 1.seq&#xff0c;值越大越优先 2.chksum&#xff0c;值越大越优先 3.age&#xff0c;本地的LSA age和收到的LSA age作比较 如果差值<900s&#xff0c;认为age一致&#xff0c;保留本地的&#xff1a;我本地有一条LSA是100 你给的是400 差值小于…...

Redis复制(replica)

Redis主从复制 [Redis主从复制]&#xff08;replica&#xff09;是一个多Redis实例进行数据同步的过程&#xff0c;其中一个实例是主实例&#xff08;Master&#xff09;&#xff0c;其他实例是从实例&#xff08;Slave&#xff09;。主实例负责处理命令请求&#xff0c;而从实…...

Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示&#xff0c;你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍&#xff0c;以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装&#xff08;不需要编译安装…...

磁盘满造成业务异常问题排查

最近遇到一个因为磁盘满导致的问题&#xff0c;分享一下&#xff0c;希望能够帮助到以后遇到同样问题的朋友。 早上突然收到业务老师反馈说&#xff1a;上传文件不能正常上传了。 想想之前都好好的&#xff0c;最近又没有更新&#xff0c;为什么突然不能使用了呢&#xff1f;…...

vim基本命令(vi、工作模式、普通模式、插入模式、可视模式、命令行模式、复制、粘贴、插入、删除、查找、替换)

1. Vim的作用 1.1. 文本编辑 1.1.1. 基础文本编辑功能 Vim是一个功能强大的文本编辑器&#xff0c;它可以用来创建、修改和保存各种文本文件。无论是编写简单的文本笔记&#xff0c;还是复杂的代码文件&#xff0c;Vim都能胜任。例如&#xff0c;我们可以用它来编写Python脚…...

vue的KeepAlive应用(针对全部页面及单一页面进行缓存)

KeepAlive的作用是缓存包裹在其中的动态切换组件 当一个组件在 中被切换时&#xff0c;它的 activated 和 deactivated 生命周期钩子将被调用&#xff0c;用来替代 mounted 和 unmounted。这适用于 的直接子节点及其所有子孙节点。 缓存全部页面 将app.vue中的路由出口改为&am…...

Big Model weekly | 第53期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 CodeRosetta: Pushing the Boundaries of Unsupervised Code Translation for Parallel Programming 近期在大型语言模型&#xff08;LLMs&#xff09;的进展重新激发了自动编程语言翻译的兴趣。特别是编码器…...

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的扩大&#xff0c;粮仓环境的智能化监控需求日益增长。传统的粮仓管理方式通常依赖人工检测和定期巡查&#xff0c;效率低下且容易出现疏漏&#xff0c;无法及时发现潜在问题&#xff0c;可能导致粮食受潮、霉变…...

大数据技术Kafka详解 ⑤ | Kafka中的CAP机制

目录 1、分布式系统当中的CAP理论 1.1、CAP理论 1.2、Partitiontolerance 1.3、Consistency 1.4、Availability 2、Kafka中的CAP机制 C软件异常排查从入门到精通系列教程&#xff08;核心精品专栏&#xff0c;订阅量已达600多个&#xff0c;欢迎订阅&#xff0c;持续更新…...

44.ComboBox的数据绑定 C#例子 WPF例子

固定最简步骤&#xff0c;包括 XAML&#xff1a; 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性&#xff0c;block则绑定和combobox一样的选择属性 C#&#xff1a; 通知的类&#xff0c;及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...

SOLID原则学习,接口隔离原则(Interface Segregation Principle, ISP)

文章目录 1. 定义2. 为什么要遵循接口隔离原则&#xff1f;3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则&#xff08;Interface Segregation Principle, ISP&#xff09; 接口隔离原则是面向对象设计中的五大原则&#xff08;SOLID&#…...

Spring Boot Web技术栈(官网文档解读)

摘要 Spring Boot框架既支持传统的Servlet技术栈&#xff0c;也支持新兴的响应式&#xff08;Reactive&#xff09;技术栈。本篇文章将详细讲述Spring Boot 对两种技术栈的详细支持和使用。 Servlet 概述 基于Java Servlet API构建&#xff0c;它依赖于传统的阻塞I/O模型&…...

闲谭SpringBoot--ShardingSphere分布式事务探究

文章目录 0. 背景1. 未分库分表时2. 仅分表时3. 分库分表时3.1 不涉及分库表3.2 涉及分库表&#xff0c;且分库表处于一个库3.3 涉及分库表&#xff0c;且分库表处于多个库3.4 涉及分库表&#xff0c;且运行中某库停机 4. 小结 0. 背景 接上篇文章《闲谭SpringBoot–ShardingS…...

计算机网络之---TCP报文段

TCP报文段 TCP报文段是TCP协议中传输数据的基本单位。TCP协议基于流控制、顺序控制和错误校验等机制&#xff0c;以确保数据的可靠传输。TCP报文段结构由多个字段组成&#xff0c;每个字段在TCP的工作中都有特定的作用 一个典型的TCP报文段由两部分组成&#xff1a; TCP头部&a…...

USB 驱动开发 --- Gadget 驱动框架梳理(一)

本文由 Linux 内核文档翻译与总结而来&#xff0c;个人学习笔记仅供参考。 Gadget 框架 在 USB 协议交互过程中&#xff0c;角色定义&#xff1a; the device driver is the master (or “client driver”) Linux 内核中称为 HCD(Host Controller Driver)&#xff0c;负责与 …...

C#读写ini配置文件保存设置参数

本示例使用设备&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b5P5rkA&ftt&id22173428704 [DllImport("kernel32", CharSet CharSet.Unicode)] public static extern uint GetPrivateProfileString(string lpAppName, stri…...

Linux---history查看命令历史记录命令

history命令是Linux系统中用于显示和管理用户之前执行过的命令列表的实用工具。以下是history命令的详细教程&#xff1a; 一、基本功能 history命令能够显示用户在当前shell会话或之前会话中执行过的所有命令。这对于回顾之前的操作、复制某个命令进行修改再次执行等场景非常…...

CANopen 学习笔记(2)

PDO通讯参数 异步传输 发送类型设置为0xFE或0xFF 修改映射参数后执行sendPDOevent(&CanFestival_Master_Data); /* 发送PDO事件 */则会触发PDO传输 还有一直就是定时器异步发送&#xff0c;配置发送类型为0xFE&#xff0c;定时器发送时间为0x64,则会以100ms的周期发送P…...

《鸿蒙Next旅游应用:人工智能赋能个性化与智能导览新体验》

随着鸿蒙Next的推出&#xff0c;旅游应用迎来了全新的发展机遇&#xff0c;借助人工智能技术能为用户带来更出色的个性化推荐和智能导览服务。 鸿蒙Next与人工智能融合优势 鸿蒙Next拥有强大的分布式能力和原生智能体验。其能打破设备界限&#xff0c;实现多设备协同&#xf…...

计算机网络 (39)TCP的运输连接管理

前言 TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;它在计算机网络中扮演着至关重要的角色。TCP的运输连接管理涉及连接建立、数据传送和连接释放三个阶段。 一、TCP的连接建立 TCP的连接建立采用三次握手机制&#xff0c;其过程如下&…...

Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250114

逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/18YtQiLnt06cPQP1nRXor0g?pwd4k3h 提取码: 4k3h Level2逐笔成交逐笔委托数据分享下载 基于Level2的逐笔成交和逐笔委托数据&#xff0c;这种毫秒级别的记录能分析出许多关键信息&#xff0c;如庄家意图、虚假动作&#…...

探索Java(适合小白)

探索Java&#xff1a;推动数字世界的语言 Java&#xff0c;这一编程语言在信息技术的海洋中如同明珠般闪耀&#xff0c;吸引着无数程序员的关注与热爱。在今天的博客中&#xff0c;我们将深入了解Java的定义、学习的重要性&#xff0c;并详细探讨Java EE的概念。无论你是编程新…...

Java Web开发高级——Spring Boot与微服务架构

微服务架构&#xff08;Microservices Architecture&#xff09;已经成为现代软件开发中的主流架构之一。它通过将单一的、庞大的应用程序拆分成多个小的、独立部署的服务&#xff0c;使得开发、维护和扩展变得更加灵活、可控。Spring Boot 提供了一种简单且高效的方式来构建微…...

IMX6U Qt 开发环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、交叉编译 1. 安装通用 ARM 交叉编译工具链 2. 安装 Poky 交叉编译工具链 二、编译出厂源码 1. U-boot 2. 内核和模块 3. 编译出厂 Qt GUI 综合 Demo 前言…...

【计算机网络】lab5 ARP协议

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...

基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用

在使用 PySide6 进行开发时&#xff0c;管理应用程序的资源&#xff08;如图标、图片、字体、样式表、音视频等&#xff09;是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc&#xff0c;它能够将资源文件&#xff08;.qrc&#xff09;编译成 Python 模块&#xff0c;然后…...

【C】初阶数据结构3 -- 单链表

之前在顺序表那一篇文章中&#xff0c;提到顺序表具有的缺点&#xff0c;比如头插&#xff0c;头删时间复杂度为O(n)&#xff0c;realloc增容有消耗等。而在链表中&#xff0c;这些问题将得到解决。所以在这一篇文章里&#xff0c;我们将会讲解链表的定义与性质&#xff0c;以及…...

STM32 FreeRTOS 基础知识

多任务处理 内核是操作系统的核心组件。诸如 Linux 这样的操作系统采用的内核&#xff0c; 看似允许用户同时访问计算机。很明显&#xff0c;多个用户可以同时执行多个程序。 每个执行程序都是受操作系统控制的任务&#xff08;或线程&#xff09;。如果一个操作系统能够以这…...

初学stm32 --- II2C_AT24C02,向EEPROM中读写数据

目录 IIC总线协议介绍 IIC总线结构图 IIC协议时序 1. ACK&#xff08;Acknowledge&#xff09; 2. NACK&#xff08;Not Acknowledge&#xff09; IO口模拟II2C协议 发送起始信号&#xff1a; 发送停止信号&#xff1a; 检测应答信号&#xff1a; 发送应答信号&#x…...

探索图像编辑的无限可能——Adobe Photoshop全解析

文章目录 前言一、PS的历史二、PS的应用场景三、PS的功能及工具用法四、图层的概念五、调整与滤镜六、创建蒙版七、绘制形状与路径八、实战练习结语 前言 在当今数字化的世界里&#xff0c;视觉内容无处不在&#xff0c;而创建和编辑这些内容的能力已经成为许多行业的核心技能…...

当comfyui-reactor-node 安装失败urllib.error.HTTPError: HTTP Error 403: Forbidden解决方法

comfyUI 节点comfyui-reactor-node 安装 python install 时 报错 urllib.error.HTTPError: HTTP Error 403: Forbidden 如下&#xff1a; (xxx) xxxxxxx:~/sdb/Q/ComfyUI/custom_nodes/comfyui-reactor-node$ python install.py Traceback (most recent call last): File …...

01基本介绍篇(D2_多线程问题)

目录 一、线程的上下文切换问题 1. 基本介绍 2. 多线程一定比单线程快&#xff1f; 3. 如何减少上下文切换 二、线程安全问题 1. 什么是线程安全&#xff1f; 2. java语言中的线程安全 2.1. 不可变 2.2. 绝对线程安全 2.3. 相对线程安全 2.4. 线程兼容 2.5. 线程对立…...

如何保证光谱相机的稳定性和可靠性

光学系统设计与制造 高质量光学元件&#xff1a;采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差&#xff0c;确保光线准确聚焦&#xff1b;高质量的镀膜能够提高光学元件的透光率&#xff0c;降低反射损失&#xff0c;并且增强对不同波段光…...

基于springboot+vue的洪涝灾害应急信息管理系统设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

登录、注册、忘记密码、首页HTML模板

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>登录</title><style>body {display: fl…...

HTML文章翻页功能

效果展示&#xff1a; 效果原理&#xff1a; 1、引入CDN 2、绘制文章翻页样式&#xff0c;以及自动分段 3、获取窗口宽高&#xff0c;计算出当前文章总分段&#xff0c;并实现分页 4、完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8&qu…...

JAVA安全编码规范

1. 数据校验 对外部输入进行校验入参的合法性&#xff0c; 防止内存越界&#xff0c;命令注入&#xff0c;SQL注入&#xff0c;格式化字符串漏洞 校验长度&#xff0c;范围&#xff0c;输入校验采用白名单形式 校验前做归一化处理&#xff0c;使用java.text.Normalizer的n…...

OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)

运行效果 工程说明 源码 vertex.glsl...

爬虫逆向学习(十五):Akamai 3.0反爬分析与sensor-data算法逆向经验

此分享只用于学习用途&#xff0c;不作商业用途&#xff0c;若有冒犯&#xff0c;请联系处理 Akamai 3.0反爬分析与sensor-data算法逆向经验 Akamai开始正题前须知站点信息接口分析反爬点反爬点定位_abck定位结果 逆向前准备工作sensor_data生成位置本地替换文件 请求体sensor…...

java项目启动时,执行某方法

1. J2EE项目 在Servlet类中重写init()方法&#xff0c;这个方法会在Servlet实例化时调用&#xff0c;即项目启动时调用。 import javax.servlet.ServletException; import javax.servlet.http.HttpServlet;public class MyServlet extends HttpServlet {Overridepublic void …...

学会使用开源软件jclasslib 字节码文件的组成 详解

应用场景 1 应用场景 2 学习路线 以正确的姿势打开文件 字节码文件的组成 玩转字节码常用工具 以正确的姿势打开文件 开源软件 jclasslib github 地址 https://github.com/ingokegel/jclasslib 工具使用 字节码文件的组成 基本信息 常量池 字段 方法 属性 详解 魔数 主副版…...

Flask表单处理与验证

Flask是一个轻量级的Python框架&#xff0c;它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库&#xff0c;用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑&#xff0c;使得表单处理更为简洁和优雅。下面&#xff0c;我们…...

如何通俗易懂的理解 html js css

HTML、CSS 和 JavaScript 是构建网页的三大核心技术。为了通俗易懂地理解它们&#xff0c;我们可以用一个简单的比喻&#xff1a;**盖房子**。 --- ### 1. **HTML&#xff1a;房子的结构** HTML&#xff08;HyperText Markup Language&#xff09;就像房子的**骨架**。它定义…...