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

C语言-数据结构-队列

目录

1.队列的特点

2.队列的实现

2.1.初始化队列

2.2.入队列

2.2.1.入空队列

2.2.2.入非空队列

2.3.出队列

2.4.销毁队列

2.5.完整代码

3.实际应用


1.队列的特点

        队列是一种常见的数据结构,它遵循先进先出(FIFO, First In First Out)原则,即先加入队列的元素先被处理(出队),后加入的元素后处理,这一点和栈的特性完全相反。队列广泛应用于计算机科学中,尤其是在任务调度、消息传递、数据缓存等场景中。

        那么关于队列的核心就是先进先出,后进后出。

2.队列的实现

        首先需要确定队列的数据结构如何设计?

        核心思路:使用单链表挂载数据节点,队列的队头指针和队尾指针指向链表头和链表尾

        由于队列不同于栈的特性,队列可以两端操作,因此需要两个指针来维护队头和队尾,那么最基本的队列的结构就可以设计出来了,如下:

/* 数据节点 */
typedef struct _DataNode {u32 data;struct _DataNode *next;
}DataNode;/* 队列 */
typedef struct _Queue {struct _DataNode *head;struct _DataNode *tail;u32 size;
}Queue;

        队列中还加入了队列大小size属性,这里如果做的更通用一些还可以考虑多线程场景,加入锁等,可根据实际需要自行调整。

2.1.初始化队列

        初始化队列就是初始化对象的过程,申请内存然后初始化队列的成员,最后返回队列即可,刚开始初始化队列,队列为空,将队头队尾指针置空即可。

/* 初始化队列 */
Queue *init_queue() {Queue *q = NULL;q = (Queue *)malloc(sizeof(Queue));if (!q) {return NULL;}q->size = 0;q->head = NULL;q->tail = NULL;return q;
}

2.2.入队列

        入队列需要考虑的问题稍微复杂一些,首先要考虑的是空队列怎么办?非空队列怎么办?

        空队列和非空队列的头尾指针的指向是不一样的~~~

2.2.1.入空队列

        入空队列操作简单,创建数据节点,将队头队尾指针都指向该数据节点即可,因为此时只有一个数据节点。

2.2.2.入非空队列

        入非空队列的过程即队头指针的指向不变,队尾指针指向新的节点,也就是说原来队尾指针的next指向新节点,新队尾指针指向新的节点。

入队列完整代码如下:

/* 入队列 */
u8 enqueue(Queue *q, u32 data) {DataNode *new = NULL;new = (DataNode *)malloc(sizeof(DataNode));if (!new) {return FALSE; }new->data = data;new->next = NULL;printf("info, enqueue addr:%p\n", new);/* 空队列 */if (q->size == 0) {    q->head = new;q->tail = new;}else {q->tail->next = new;q->tail = new;}q->size++;return TRUE;
}

2.3.出队列

        出队列的过程和入队列相反,只需要修改队头指针即可,然后返回原有的队头节点即可。

出队完整代码如下:

/* 出队列 */
DataNode *dequeue(Queue *q) {DataNode *node = NULL;if (q->size) {node = q->head;q->head = q->head->next;q->size--;}printf("info, dequeue addr:%p\n", node);return node;
}

2.4.销毁队列

        销毁队列的过程和出队列的过程类似,只需要从队头开始遍历,直到队列中没有元素为止。

/* 销毁队列 */
void destory_queue(Queue *que) {if (!que) {return;}while(que->size) {DataNode *node = que->head;printf("info, destory_queue addr:%p\n", node);que->head = que->head->next;free(node);node = NULL;que->size--;}free(que);que = NULL;
}

2.5.完整代码

#include <stdio.h>
#include <stdlib.h>typedef unsigned char u8;
typedef unsigned int u32;#define FALSE 0
#define TRUE 1/* 数据节点 */
typedef struct _DataNode {u32 data;struct _DataNode *next;
}DataNode;/* 队列 */
typedef struct _Queue {struct _DataNode *head;struct _DataNode *tail;u32 size;
}Queue;/* 初始化队列 */
Queue *init_queue() {Queue *q = NULL;q = (Queue *)malloc(sizeof(Queue));if (!q) {return NULL;}q->size = 0;q->head = NULL;q->tail = NULL;return q;
}/* 销毁队列 */
void destory_queue(Queue *que) {if (!que) {return;}while(que->size) {DataNode *node = que->head;printf("info, destory_queue addr:%p\n", node);que->head = que->head->next;free(node);node = NULL;que->size--;}free(que);que = NULL;
}/* 入队列 */
u8 enqueue(Queue *q, u32 data) {DataNode *new = NULL;new = (DataNode *)malloc(sizeof(DataNode));if (!new) {return FALSE; }new->data = data;new->next = NULL;printf("info, enqueue addr:%p\n", new);/* 空队列 */if (q->size == 0) {    q->head = new;q->tail = new;}else {q->tail->next = new;q->tail = new;}q->size++;return TRUE;
}/* 出队列 */
DataNode *dequeue(Queue *q) {DataNode *node = NULL;if (q->size) {node = q->head;q->head = q->head->next;q->size--;}printf("info, dequeue addr:%p\n", node);return node;
}int main() {Queue *que = NULL;que = init_queue();if (!que) {printf("init queue failed !\n");return -1;}if (!enqueue(que, 10)) {printf("enqueue failed !\n");return -1;}if (!enqueue(que, 100)) {printf("enqueue failed !\n");return -1;}DataNode *node = dequeue(que);printf("info, dequeue node value:%u\n", node->data);free(node);node = NULL;destory_queue(que);return 0;
}

运行结果:

3.实际应用

dpdk中关于ring的描述:

        dpdk中关于环形队列的设计非常巧妙,感兴趣的可以自行研究。

相关文章:

C语言-数据结构-队列

目录 1.队列的特点 2.队列的实现 2.1.初始化队列 2.2.入队列 2.2.1.入空队列 2.2.2.入非空队列 2.3.出队列 2.4.销毁队列 2.5.完整代码 3.实际应用 1.队列的特点 队列是一种常见的数据结构&#xff0c;它遵循先进先出&#xff08;FIFO, First In First Out&#xff09…...

STL之VectorMapList针对erase方法踩坑笔记

前沿 如下总结的三种容器&#xff0c;开头都会涉及当前容器的特点&#xff0c;再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器&#xff0c;存储内存是连续&#xff0c;且特点支持快速访问&#xff0c;但是插入和删除效率比较地(需要找查找和移动)。另…...

梯度下降法为什么要提前停止

什么是提前停止&#xff08;Early Stopping&#xff09;&#xff1f; 提前停止是一种正则化技术&#xff0c;用于在训练机器学习模型&#xff08;特别是神经网络&#xff09;时防止过拟合。它的核心思想是通过监控模型在验证集上的性能&#xff0c;在性能开始恶化之前停止训练…...

【vue3项目使用 animate动画效果】

vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示&#xff1a;干货篇&#xff0c;不废话&#xff0c;点赞收藏&#xff0c;用到会后好找藕~ 点击这里&#xff0c;直接看官网哦 &#x1f449; 官网地址&#…...

1.1.1 C语言常用的一些函数(持续更新)

总框架见&#xff08;0. 总框架-CSDN博客&#xff09; &#xff08;1&#xff09;socket (a)分配fd&#xff1b;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…...

李宏毅机器学习课程笔记03 | 类神经网络优化技巧

文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training&#xff1a;Batch and MomentumSmall Batch vs Large Batch回顾&#xff1a;optimization优化 找到参数使L最小问题&#xff1a;为什么要用Batch&#xff…...

简洁明快git入门及github实践教程

简洁明快git入门及github快速入门实践教程 前言git知识概要&#xff1a;一&#xff1a;什么是 Git&#xff1f;二&#xff1a;安装 Git三&#xff1a;配置 Git配置git的用户名和邮箱地址创建仓库 四&#xff1a;Git实践五&#xff1a;远程仓库操作&#xff08;基于git命令使用G…...

Python使用socket实现简易的http服务

在接触的一些项目中&#xff0c;有时为了方便可视化一些服务状态&#xff08;请求数很少&#xff09;&#xff0c;那么很容易想到使用http服务来实现。但开源的web后端框架&#xff0c;例如flask&#xff0c;fastapi&#xff0c;django等略显沉重&#xff0c;且使用这些框架会有…...

【Hive】海量数据存储利器之Hive库原理初探

文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…...

linux系统监视(centos 7)

一.系统监视 1.安装iostat&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…...

Blazor中Syncfusion图像编辑器组件使用方法

Blazor中Syncfusion图像编辑器组件是一个功能丰富的图像处理工具&#xff0c;支持多种编辑、操作和交互方式&#xff0c;帮助用户高效处理图像。以下是该组件的主要功能总结&#xff1a; 主要功能&#xff1a; 图像打开与保存 图像编辑器允许用户通过简单的点击操作打开支持的…...

电动汽车V2G技术Matlab/Simulink仿真模型

今天给大家更新关于V2G技术的仿真&#xff0c;不是研究这个方向的&#xff0c;可能会对这个名称比较陌生&#xff0c;那么&#xff0c;什么是“V2G”&#xff1f; V2G全称&#xff1a;Vehicle-to-Grid&#xff0c;即车网互动&#xff0c;利用电动汽车特有的储能功能与电网“双…...

C++中的unordered_set和unordered_map的模拟实现

一、封装基本结构 与map和set的封装过程很想&#xff0c;unordered_set和unordered_map也需要用MapKeyOfT和SetKeyOfT创建哈希表类型&#xff0c;借此获取对应的key值来使用&#xff1b; 因此&#xff0c;在哈希表中也一样需要用参数class T来替代set中的key和map中的pair<…...

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域&#xff0c;Spring Boot 2 凭借其卓越的特性&#xff0c;为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2&#xff0c;以下这份精心…...

(一)QSQLite3库简介

1、SQLite数据库 SQLite数据库&#xff0c;作为一个轻量级的关系型数据库管理系统&#xff0c;广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点&#xff0c;它为开发者提供了极大的便利。然而&#xff0c;正是由于其应用广泛&#xff0c;随着用户对于系统…...

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和&#xff08;Internet Checksum&#xff09;算法。通过阅读《RFC 1071》文档理解该算法的工作原理&#xff0c;并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文&#xff08;包括ICMP、TCP、UDP等&a…...

hot100_240. 搜索二维矩阵 II

hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,1…...

78_Redis网络模型

1.Redis网络模型概述 1.1 Redis网络模型介绍 Redis 7.x的网络模型基于epoll的Reactor模式实现,这是一个高效的事件驱动模型。在Redis中,所有的网络事件(如连接、读写等)都由一个事件循环(Event Loop)来处理。这个事件循环负责监听套接字上的事件,并根据事件类型调用相…...

python范围

用户图形界面-工资计算器 from tkinter import *def f():w int(e1.get()) int(e2.get()) - int(e3.get())wage.insert(0,w)root Tk() root.title("工资计算器") Label(root, text"每月基本工资&#xff1a;").pack() e1 Entry(root) e1.pack() Label(…...

vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习

前言 靶机&#xff1a;Raven-2&#xff0c;IP地址为192.168.10.9 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 文章所用靶机来自vulnhub&#xff0c;可通过官网下载&#xff0c;或者通过链接:https://pan.quark.cn/s/a65…...

③ AI副业第一步:如何找到适合自己的AI赚钱赛道

③ AI副业第一步&#xff1a;如何找到适合自己的AI赚钱赛道选对赛道&#xff0c;努力才有意义。选错赛道&#xff0c;越努力离钱越远。前言&#xff1a;为什么大多数人AI副业做不起来&#xff1f; 我观察了100想做AI副业的人&#xff0c;失败的原因高度一致&#xff1a; 失败路…...

OpenClaw用户如何快速接入Taotoken并开始Agent工作流

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 OpenClaw用户如何快速接入Taotoken并开始Agent工作流 对于使用OpenClaw框架构建AI智能体的开发者而言&#xff0c;快速接入稳定、多…...

半导体元件(二极管/三极管/MOS管/IC)损坏诊断全解

半导体元件&#xff08;二极管、三极管、MOS 管、集成电路&#xff09;是 PCB 的核心功能单元&#xff0c;对过压、过流、ESD、高温极度敏感&#xff0c;损坏后直接导致电路功能失效、短路烧板。很多工程师维修时盲目更换芯片&#xff0c;不仅成本高&#xff0c;还易误判。​一…...

XZ6128A工作电压5-100V 输出电流5A 升压型大功率LED灯恒流驱动控制芯片

概述 XZ6128A是一款高效率、高精度的升压型大功率LED灯恒流驱动控制芯片。 XZ6128A内置高精度误差放大器&#xff0c;固定关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率、多个高亮度LED灯串的恒流驱动。 XZ6128A采用固定关断时间的控制方式&#xff0…...

TorchEasyRec:阿里巴巴开源的推荐系统深度学习框架详解

第一部分&#xff1a;项目概览与核心功能 一、项目简介&#xff1a;什么是 TorchEasyRec&#xff1f; TorchEasyRec 是阿里巴巴 PAI 团队开发的基于 PyTorch 的推荐系统框架&#xff0c;专门用于构建生产级别的深度学习推荐模型。简单来说&#xff0c;它就是一个让你能够快速…...

中兴新支点NewStartOS初体验:从激活到日常使用,聊聊这个国产Linux桌面的真实感受

中兴新支点NewStartOS深度体验&#xff1a;一个技术爱好者的真实使用笔记第一次启动中兴新支点NewStartOS时&#xff0c;那个简洁的登录界面就给我留下了不错的印象。作为一个长期在Windows和macOS之间切换的用户&#xff0c;这次尝试国产Linux桌面系统&#xff0c;更像是一次充…...

CANoe测试效率翻倍:手把手教你用XML Test Module搭建可复用的测试套件

CANoe测试效率翻倍&#xff1a;手把手教你用XML Test Module搭建可复用的测试套件在车载电子系统开发中&#xff0c;测试环节往往占据整个项目周期的40%以上时间。面对频繁的ECU软件迭代和多样化配置需求&#xff0c;传统逐个脚本执行测试的方式已经无法满足敏捷开发的要求。本…...

Elsevier-Tracker:5分钟打造您的学术论文审稿进度监控系统

Elsevier-Tracker&#xff1a;5分钟打造您的学术论文审稿进度监控系统 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 在科研工作者的日常中&#xff0c;论文审稿进度追踪常常成为消耗时间与精力的隐形负担。每天反…...

终极指南:如何用ESP32打造专业级蓝牙游戏手柄

终极指南&#xff1a;如何用ESP32打造专业级蓝牙游戏手柄 【免费下载链接】ESP32-BLE-Gamepad Bluetooth LE Gamepad library for the ESP32 项目地址: https://gitcode.com/gh_mirrors/es/ESP32-BLE-Gamepad 你是否曾经想过用ESP32开发板制作一个自定义的游戏控制器&am…...

Windows任务栏透明化终极指南:5分钟掌握TranslucentTB完整设置技巧

Windows任务栏透明化终极指南&#xff1a;5分钟掌握TranslucentTB完整设置技巧 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 您是否厌倦…...