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.队列的特点 队列是一种常见的数据结构,它遵循先进先出(FIFO, First In First Out)…...
STL之VectorMapList针对erase方法踩坑笔记
前沿 如下总结的三种容器,开头都会涉及当前容器的特点,再者就本次针对erase方法的使用避坑总结。 一.Vector vector关联关联容器,存储内存是连续,且特点支持快速访问,但是插入和删除效率比较地(需要找查找和移动)。另…...
梯度下降法为什么要提前停止
什么是提前停止(Early Stopping)? 提前停止是一种正则化技术,用于在训练机器学习模型(特别是神经网络)时防止过拟合。它的核心思想是通过监控模型在验证集上的性能,在性能开始恶化之前停止训练…...
【vue3项目使用 animate动画效果】
vue3项目使用 animate动画效果 前言一、下载或安装npm 安装 二、引入组件三、复制使用四、完整使用演示总结 前言 提示:干货篇,不废话,点赞收藏,用到会后好找藕~ 点击这里,直接看官网哦 👉 官网地址&#…...
1.1.1 C语言常用的一些函数(持续更新)
总框架见(0. 总框架-CSDN博客) (1)socket (a)分配fd;(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:Batch and MomentumSmall Batch vs Large Batch回顾:optimization优化 找到参数使L最小问题:为什么要用Batchÿ…...
简洁明快git入门及github实践教程
简洁明快git入门及github快速入门实践教程 前言git知识概要:一:什么是 Git?二:安装 Git三:配置 Git配置git的用户名和邮箱地址创建仓库 四:Git实践五:远程仓库操作(基于git命令使用G…...
Python使用socket实现简易的http服务
在接触的一些项目中,有时为了方便可视化一些服务状态(请求数很少),那么很容易想到使用http服务来实现。但开源的web后端框架,例如flask,fastapi,django等略显沉重,且使用这些框架会有…...
【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,sar,sysstat(默认没有,安装过可以跳跃) iostat 和 sar: 同样,iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装:sudo yum install sysstat解释…...
Blazor中Syncfusion图像编辑器组件使用方法
Blazor中Syncfusion图像编辑器组件是一个功能丰富的图像处理工具,支持多种编辑、操作和交互方式,帮助用户高效处理图像。以下是该组件的主要功能总结: 主要功能: 图像打开与保存 图像编辑器允许用户通过简单的点击操作打开支持的…...
电动汽车V2G技术Matlab/Simulink仿真模型
今天给大家更新关于V2G技术的仿真,不是研究这个方向的,可能会对这个名称比较陌生,那么,什么是“V2G”? V2G全称:Vehicle-to-Grid,即车网互动,利用电动汽车特有的储能功能与电网“双…...
C++中的unordered_set和unordered_map的模拟实现
一、封装基本结构 与map和set的封装过程很想,unordered_set和unordered_map也需要用MapKeyOfT和SetKeyOfT创建哈希表类型,借此获取对应的key值来使用; 因此,在哈希表中也一样需要用参数class T来替代set中的key和map中的pair<…...
Spring Boot 2 学习指南与资料分享
Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域,Spring Boot 2 凭借其卓越的特性,为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2,以下这份精心…...
(一)QSQLite3库简介
1、SQLite数据库 SQLite数据库,作为一个轻量级的关系型数据库管理系统,广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点,它为开发者提供了极大的便利。然而,正是由于其应用广泛,随着用户对于系统…...
《计算机网络》课后探研题书面报告_网际校验和算法
网际校验和算法 摘 要 本文旨在研究和实现网际校验和(Internet Checksum)算法。通过阅读《RFC 1071》文档理解该算法的工作原理,并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文(包括ICMP、TCP、UDP等&a…...
hot100_240. 搜索二维矩阵 II
hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入: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"每月基本工资:").pack() e1 Entry(root) e1.pack() Label(…...
vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习
前言 靶机:Raven-2,IP地址为192.168.10.9 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 文章所用靶机来自vulnhub,可通过官网下载,或者通过链接:https://pan.quark.cn/s/a65…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
