数据结构之队列详解
1.队列的概念以及结构
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFo(Frist in Frist out)的特性
入队列:进行插入才操作的一端称为队尾
出队列:进行删除操作的一端称为队头

2.队列的实现
队列也可以使用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会很低

队列常见的基本操作:
//初始化
void QueueInit(Queue* pq);
//清空队列成员
void QueueDestroy(Queue* pq);
//队尾插入元素
void QueuePush(Queue* pq, QDataType x);
//删除队队头元素,队列先进先出
void QueuePop(Queue* pq);
//获取队头元素
int QueueFront(Queue * pq);
//获取队尾元素
int QueueBack(Queue* pq);
//获取队列中有效与元素个数
int QueueSize(Queue* pq);
//查看队列是否为空
bool QueueEmpty(Queue* pq);
每个功能的实现以及解释
实现队列这里我们使用的是动态顺序表
->1.初始化队列
//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}
->2.清空队列成员
//清空队列成员
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->head;//QNode* cur = pq->head->next;while (cur){/*free(pq->head);pq->head = cur;cur = cur->next;*/QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}
->3.队尾插入元素
//队尾插入元素
void QueuePush(Queue* pq, QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (NULL == newnode){perror("QueuePsuh::malloc");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}
->4.删除队队头元素,队列先进先出
//删除队列成员,队列先进先出
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head != NULL);//第一种方法//Queue* cur = pq->head;//if (cur->next == NULL)//{// free(cur);// pq->head = pq->tail = NULL;//}/*else{pq->head = cur->next;free(cur);cur = NULL;}*///第二种方法QNode* next = pq->head->next;free(pq->head);pq->head = next;if (pq->head == NULL){pq->tail = NULL;}pq->size--;
}
->5.获取队头元素
//获取队头成员
int QueueFront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->data;
}
->6.获取队尾元素
//获取队尾成员
int QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}
->7.获取队列中有效元素个数
//获取队列中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
->8.查看队列是否为空
//查看队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0; //pq->head == NULL && pq->tail == NULL
}
3.完整代码
Queue.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>typedef int QDataType;typedef struct QListNode
{struct QListNode* next;QDataType data;
}QNode;typedef struct Queue
{QNode* head;QNode* tail;QDataType size;
}Queue;//初始化
void QueueInit(Queue* pq);
//清空队列成员
void QueueDestroy(Queue* pq);
//队尾插入队列
void QueuePush(Queue* pq, QDataType x);
//删除队队头元素,队列先进先出
void QueuePop(Queue* pq);
//获取队头元素
int QueueFront(Queue * pq);
//获取队尾元素
int QueueBack(Queue* pq);
//获取队列中有效与元素个数
int QueueSize(Queue* pq);
//查看队列是否为空
bool QueueEmpty(Queue* pq);
Queue.c
#include "queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}//销毁队列
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->head;//QNode* cur = pq->head->next;while (cur){/*free(pq->head);pq->head = cur;cur = cur->next;*/QNode* next = cur->next;free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;
}//插入队列成员
void QueuePush(Queue* pq, QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (NULL == newnode){perror("QueuePsuh::malloc");return;}newnode->data = x;newnode->next = NULL;if (pq->head == NULL){assert(pq->tail == NULL);pq->head = pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}//删除队列成员,队列先进先出
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head != NULL);//Queue* cur = pq->head;//if (cur->next == NULL)//{// free(cur);// pq->head = pq->tail = NULL;//}/*else{pq->head = cur->next;free(cur);cur = NULL;}*/QNode* next = pq->head->next;free(pq->head);pq->head = next;if (pq->head == NULL){pq->tail = NULL;}pq->size--;
}//获取队头成员
int QueueFront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->data;
}//获取队列中有效元素个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}//获取队尾成员
int QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;
}//查看队列是否为空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0; //pq->head == NULL && pq->tail == NULL
}
test.c
#include "queue.h"int main()
{Queue st;QueueInit(&st);QueuePush(&st, 1);QueuePush(&st, 2);QueuePush(&st, 3);QueuePush(&st, 4);QueuePush(&st, 5);while (!QueueEmpty(&st)){printf("%d ", QueueFront(&st));QueuePop(&st);}printf("\n");return 0;
}
测试结果:

相关文章:
数据结构之队列详解
1.队列的概念以及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFo(Frist in Frist out)的特性 入队列:进行插入才操作的一端称为队尾 出队列:进行删除操作的一…...
[渗透测试] 反序列化漏洞
反序列化漏洞 序列化:将对象的状态信息转换为可以传输或存储的形式的过程。简单的来说,就是将一个抽象的对象转换成可以传输的字符串 ,以特定的形式在进行之间实现跨平台的传输。 序列化大多以字节流、字符串、json串的形式来传输。将对…...
C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等
C 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等 flyfish 0. 隐式转换(Implicit Conversions) 隐式转换是编译器自动进行的类型转换,通常在需要将一个类型转换为另一个类型以匹配函数参…...
等保通过标准
等保测评,即信息系统安全等级保护测评,是国家对信息系统安全等级保护的一种评估活动。它涉及到安全管理、安全技术、安全运维等多个方面,旨在评定信息系统是否达到了国家设定的安全等级保护标准。等保测评的通过标准通常会根据信息系统的安全…...
reduceByKey 函数详解
reduceByKey 函数详解 实现原理 reduceByKey 函数主要用于处理分布式数据集。它接收两个操作符作为参数: keySelector:这是一个映射函数,用于从输入元素中提取键。 valueReducer:这是另一个函数,用于将具有相同键的…...
CSI-RS在信道中传输的过程
简单介绍CSI-RS信号生成,在信道中传输和接收的过程 1.载波配置 首先需要配置载波相关的参数 系统带宽和子载波间隔 5G NR中,系统带宽和子载波间隔是两个关键参数,共同决定无线资源的分配和使用 系统带宽 5G NR支持广泛的系统带宽&…...
建造者模式(Builder Pattern)工作原理
文章目录 [toc]建造者模式(Builder Pattern)工作原理一、基本概念二、主要角色三、工作流程(一)定义产品(二)定义抽象建造者(三)定义具体建造者(四)定义指挥者…...
Ubuntu22.04安装Go语言的几种方式
在 Ubuntu 22.04 上安装 Go 语言可以通过几种不同的方法,以下是两种常见的安装方法: 方法1:使用 go 官方安装脚本 打开终端。 下载 Go 语言的安装脚本: curl -O https://go.dev/dl/go1.22.5.linux-amd64.tar.gz请检查 Go 官方网…...
Typora笔记上传到CSDN
1.Typora 安装 Typora链接:百度网盘 提取码:b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…...
Modbus转BACnet/IP网关BA100-配硬件说明
在现代自动化系统中,不同设备和系统之间的通信至关重要,Modbus和BACnet/IP协议虽然各有优势,但它们之间的直接通信存在障碍。钡铼Modbus转BACnet/IP网关作为连接这两种协议的桥梁,允许不同系统之间的无缝数据交换。 一、Modbus转…...
DjangoRF实战-2-apps-users
1、用户模块 创建一个用户模块子应用,用来管理用户,和认证和授权。 1.1根目录创建apps, 为了使用方便,还需要再pycharm中设置一下资源路径,就可以自动提示 1.2注册子应用 1.3添加应用根目录到环境变量path python导…...
java面试题,有synchronized锁,threadlocal、数据可以设置默认值、把redis中的json转为对象
有面试题,有synchronized锁,threadlocal 一、面试题小记二、加锁synchronized1. 先看代码2. synchronized 讲解2.1. 同步代码块2.2. 同步方法2.3. 锁的选择和影响2.4. 注意事项2.5 锁的操作,手动释放锁,显式地获取锁(属…...
Apache Spark:深度解析
文章目录 引言Apache Spark 官网链接Spark 的原理1. 核心组件2. 弹性分布式数据集(RDD)3. 执行模型 基础使用1. 环境搭建2. 示例代码 高级功能1. DataFrame 和 Dataset2. 机器学习3. 流处理 优缺点优点缺点 结论 引言 Apache Spark 是一个快速、通用、可…...
使用umi作为模板如何实现权限管理
三种权限管理的方法: 在做后台管理系统时,难免会使用到权限管理,权限管理方式有三种,分别是:路由、守卫、后端配合。 路由:通过动态路由,根据登录人员不同注册不同的路由,直接让没…...
系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识-解读
系统架构设计师教程 第4章 信息安全技术基础知识-4.1 信息安全基础知识 4.1.1 信息安全的概念4.1.1.1 信息安全的范围4.1.1.1.1 设备安全4.1.1.1.2 数据安全4.1.1.1.3 内容安全4.1.1.1.4 行为安全 4.1.2 信息存储安全4.1.2.1 信息使用的安全4.1.2.1.1 用户的标识与验证4.1.2.1.…...
【Rust光年纪】探索Rust游戏开发世界:六款引人注目的游戏引擎与框架
探索Rust游戏开发引擎:选择合适的工具 前言 随着Rust语言的不断发展,越来越多的游戏开发者开始将其视作构建游戏引擎和框架的理想选择。本文将介绍几个用于Rust语言的游戏引擎和框架,分别对其核心功能、使用场景、安装与配置以及API进行概览…...
从数据时代到智能时代,星环科技信雅达联合发布金融全栈解决方案
近年来,星环科技与信雅达在金融行业的多个关键领域展开了广泛而深入的合作,推出了一系列面向金融科技领域的联合解决方案。此次合作基于星环科技在大数据、人工智能和云计算领域的先进技术,以及信雅达在金融领域的深厚积累,围绕数…...
自定义维度映射:Kylin Cube设计的高级玩法
自定义维度映射:Kylin Cube设计的高级玩法 在数据仓库领域,Apache Kylin以其高性能的分析能力而闻名。Kylin通过构建多维数据立方体(Cube)来实现对大数据集的快速查询。Cube设计中的维度映射是优化查询性能的关键环节。本文将探讨…...
c17 新特性 字面量,变量,函数,隐藏转换等
导论 c17新特性引入了许多新的语法,这些语法特性更加清晰,不像传统语法,语义飘忽不定,比如‘a’你根本不知道是宽字符还是UTF-8 字符。以及测试i i,最后结果到底是多少。这种问题很大情况是根据编译器的优化进行猜测&a…...
git操作的一些备忘录
1.回退本地合并 git merge --abort 2.撤销上一次的提交 方法一:(已经提交到git线上仓库了,git reset操作,会把之前提交的都删除,感觉有点危险) 想要让Git回退历史,有以下步骤: 使用git log命令,…...
工业控制中自定义串行总线协议的设计与实现:DataView系统实战
1. 项目背景与核心需求:为什么需要自定一个串行总线?在工业控制领域,尤其是信号调理模块和开关电源这类产品里,我们常常会遇到一个看似简单、实则棘手的问题:如何在有限的成本、空间和算力下,为多个分散的模…...
P1238 走迷宫【洛谷算法习题】
P1238 走迷宫 网页链接 P1238 走迷宫 题目描述 有一个 mnm\times nmn 格的迷宫(表示有 mmm 行、nnn 列),其中有可走的也有不可走的,如果用 111 表示可以走,000 表示不可以走,文件读入这 mnm\times nmn 个数据和起始点、结束点…...
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上
DeepSeek本地部署:从零开始,把大模型跑在自己电脑上我们公司因为数据安全要求,所有文档不能传到外部API。但团队又想用AI辅助写代码、做文档分析。解决方案:本地部署DeepSeek。这篇文章记录了完整的部署过程、踩过的坑、以及部署之…...
让老旧PL-2303串口设备在Windows 10/11重获新生的终极指南
让老旧PL-2303串口设备在Windows 10/11重获新生的终极指南 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 还在为Windows 10或Windows 11系统上无法使用老旧的PL-2303串…...
MCP图像生成服务器:在IDE中无缝集成AI绘图,提升开发与设计效率
1. 项目概述:一个能“听懂人话”的智能图像生成服务器 如果你和我一样,经常在 Cursor、Claude Code 这类 AI 编程工具里写代码、做设计,那你肯定遇到过这样的场景:脑子里有个很棒的视觉创意,比如“一个赛博朋克风格的…...
抖音去水印免费版哪个好用?2026实测推荐与软件对比
抖音去水印免费版哪个好用?2026实测推荐与软件对比 刷到一条有意思的视频想保存下来发给朋友,下载后却发现左上角顶着一串"用户名"水印;好不容易找到一段适合做素材的内容,画面边缘那行字怎么裁都裁不干净。这几乎是每个…...
航空航天装备制造行业「气动外形工程师→型号总师、技术副总、CTO」完整晋升路径
适配主机厂、飞行器研究所、航空航天整机 / 无人机 / 导弹装备制造企业,纯技术线 技术管理线双轨晋级,从气动外形基层岗一路到集团 / 公司 CTO,岗位阶梯清晰无断层。一、基层技术阶段(入门→骨干,纯气动专业ÿ…...
Tokscale:AI编程助手Token成本监控与优化实战指南
1. 项目概述:为什么你需要一个AI助手“电费”监控器 如果你和我一样,每天的工作流里塞满了各种AI编程助手——从OpenCode、Claude Code到Cursor、Copilot CLI,甚至还在尝试各种新冒出来的工具,那你肯定有过这样的瞬间:…...
电信运营商M2M战略转型:从连接人到连接物的物联网新增长引擎
1. 从“人联网”到“物联金矿”:电信运营商的M2M战略转型 在过去的二十年里,全球的移动通信网络经历了一场狂飙突进,其核心使命始终围绕着“连接人”。从2G时代的短信和语音,到3G/4G时代的移动互联网,再到如今5G所描绘…...
别墅装修里的石材,选错是费钱,用错是麻烦
每次去工地,尤其是那些还没完工的别墅,总能看到角落里堆着几块大板。业主或者设计师会指着它们,兴奋地描述这里用爵士白,那里用鱼肚灰。但说实话,很多时候,这些选择在落地前,就已经埋下了后期保…...
