暴力数据结构之栈与队列(队列详解)
1.队列的定义
队列是一种特殊的线性表,它遵循先进先出(FIFO)的原则。在队列中,只允许在表的一端进行插入操作(队尾),而在另一端进行删除操作(队头)。这种数据结构确保了最先进入队列的元素总是最先离开队列。队列中没有元素时,被称为空队列。队列的组织和实施训练通常由队列条令予以规定,用于规范部队、分队队列及其在各种条件下的运动队形和动作。
出队的是队头,入队的为队尾

2.实现队列
对于队列,我们知道是一种线性表,我们可以使用单链表、双向链表或者数组都可以实现,这里我们首先介绍使用单链表实现的。
对于单链表实现队列,我们知道队列有队头和队尾,所以设置两个指针*phead 和*ptail表示头尾,但是如何找到头和尾需要讨论,如果只是创建一个单链表,那么索引头尾就十分繁琐,所以我们可以设计两个链表,一个存储数据,一个索引头尾,这样就很方便的实现了队列。
typedef int QDataType;typedef struct QueueNode
{struct QueueNode* next;QDataType val;
}QNode;typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;
解释:创建一个单链表 QueueNode 用来存储队列元素,再创建一个单链表 Queue 索引队头和队尾,插入数据时 QueueNode 使用动态内存申请开辟空间节点 newnode, 尾节点 *ptail 指向新开辟的节点,即索引队尾,队头保持不变,从而实现索引头尾的功能。
3.队列的相关操作
3.1 初始化和销毁
初始化:断言传入指针不为NULL,将起索引作用的链表头尾均置为NULL,链表长度初始化为0。
void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}
销毁:创建一个cur指针保存头结点,依次释放,最后将整个链表初始化。
void QueueDestroy(Queue* pq)
{assert(pq);QNode* cur = pq->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->phead = pq->ptail = NULL;pq->size = 0;
}
3.2 插入和删除
插入:队列只有队尾插入,所以直接在QueueNode单链表上动态内存开辟一个newnode新节点,然后让单链表Queue索引头尾,修改Queue中的数据。
// 队尾插入
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");return;}newnode->next = NULL;newnode->val = x;if (pq->ptail == NULL){pq->phead = pq->ptail = newnode;}else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}
删除: 首先判断删除的链表是否为NULL,不为NULL则可以删除,所以创建一个新的next 保存待删除节点,释放节点,置为NULL,当然若只有一个节点即*phead就是*ptail,将他们置为NULL即可。
// 队头删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->size != 0);/*QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;if (pq->phead == NULL)pq->ptail = NULL;*/// 一个节点if (pq->phead->next == NULL){free(pq->phead);pq->phead = pq->ptail = NULL;}else // 多个节点{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}
3.3 取出队头或队尾的数据
取出队头:这时两个单链表的作用就体现出来了,取队头直接取phead->val的元素即可。
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->phead);return pq->phead->val;
}
取出队尾:直接返回尾节点ptail->val的数据即可。
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->ptail);return pq->ptail->val;
}
3.4 判空与计算链表长度
计算链表长度:直接返回Queue中的size即可
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}
判空: 判断链表长度是否为0,是则为空,反之不为空。
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->size == 0;
}
相关文章:
暴力数据结构之栈与队列(队列详解)
1.队列的定义 队列是一种特殊的线性表,它遵循先进先出(FIFO)的原则。在队列中,只允许在表的一端进行插入操作(队尾),而在另一端进行删除操作(队头)。这种数据结构确保了最…...
仿照JDK源码写一个ArrayList实现
仿照JDK编写一个简化的ArrayList实现是一个很好的学习Java集合框架内部工作原理的方式。以下是一个简化版的ArrayList实现,它包含了基本的添加、获取、删除和大小检查功能。 public class MyArrayList<E> {private static final int DEFAULT_CAPACITY = 10;private Obj…...
[链表专题]力扣21, 234
1. 力扣21 题 : 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2:输入:l1 [], l2 [] 输出&…...
智慧便民小程序源码系统 求职招聘+房产出租+相亲交友 带完整的安装代码包以及系统搭建教程
在数字化、智能化的今天,我们的生活节奏越来越快,对于各种服务的需求也越发多元化和个性化。为了满足广大市民对于便捷、高效、全面的服务需求,罗峰给大家分享一款智慧便民小程序源码系统,集求职招聘、房产出租、相亲交友三大功能…...
苹果免签封装的优势和安全风险
哈喽,大家好呀,淼淼又来和大家见面啦,许多小伙伴应该都知道,App Store一直是iOS应用的主要分发渠道,苹果生态系统的监管是十分严格的,以此确保了应用质量与用户的安全。而苹果免签封装则是有一种不需要通过…...
hook抓包trace定位实战
title: SO逆向之大众点评cx date: 2022-02-07 19:27:28 tags: SOfrida categories: 安卓逆向 toc_number: true抓包10.37.13 打开首页一篇文章,APP默认TCP连接,通过降级采用HTTP连接 jadx反编译代码中 public int g() {Object[] objArr = new Object[0];ChangeQuickRedire…...
SMB 协议详解之-TreeID原理和SMB数据包分析技巧
在前面分析SMB协议数据包的过程中,这里,可以看到在SMB协议中存在很多的ID,即Unique Identifiers。那么这些ID表示什么含义?在实际分析数据包的过程中如何根据这些ID进行过滤分析?本文将介绍SMB/SMB2中的tree id ,并介绍如何通过tree id 快速的分析SMB数据包中各种命令交互…...
博士阶段应该搞什么:-人才引进要求
目录 专利,高水平论文(一作),技能证书,职称,高端竞赛,科研成果奖 济宁学院...
超全MySQL锁机制介绍
前言 MySQL作为关系型数据库管理系统中的佼佼者,为了保证数据的一致性和完整性,在并发控制方面采用了锁机制。锁机制是数据库管理系统用于控制对共享资源的访问,避免多个事务同时修改同一数据造成的数据不一致问题。了解MySQL的锁机制对于数…...
【CV】计算机视觉中的特征追踪与背景处理
计算机视觉领域中的重要任务之一是视频特征追踪,它可以用于目标跟踪、运动分析、行为识别等应用。然而,在实际应用中,经常会遇到需要仅处理视频中特定特征物体而忽略背景的情况,这就需要进行背景处理。本文将介绍如何使用Python和…...
CAPL如何实现TLS握手认证
CAPL有专门的章节介绍如何实现TLS握手认证的函数: CAPL调用哪些函数实现TLS握手认证,需要了解TLS在整个通信过程的哪个阶段。 首先TCP需要建立连接,这是TLS握手的前提。当TLS握手认证完成后,可以传输数据。 所以TLS握手开始前需要确保TCP建立连接,TCP传输数据前需要确保…...
Linux -- 日志
一 日志的重要性 在之前的编程经历中,如果我们的程序运行出现了问题,都是通过 标准输出 或 标准错误 将 错误信息 直接输出到屏幕上,以此来排除程序中的错误。 这在我们以往所写的程序中使用没啥问题,但如果出错的是一个不断在运行…...
WebRtc 视频通话,语音通话实现方案
先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素,用于显示本地视频 --><video ref"r…...
IndyTcpServer使用详解
1、IndyTCPserver的创建 IdTCPServer1.DefaultPort:= 8000; IdTCPServer1.ListenQueue:= 1024; //同时处理请求队列数限制 IdTCPServer1.MaxConnections:= 1024; //同时连接数量限制,为0不限制连接数 IdTCPServer1.ContextClass:= TNewIdServerContext; //设置为自定义TIdSe…...
pytest + yaml 框架 - 参数化读取文件路径优化
针对小伙伴提出参数化时读取外部文件,在项目根路径运行没问题,但是进入到项目下子文件夹运行用例,就会找不到文件问题做了优化。 关于参数化读取外部文件相关内容参考前面这篇pytest yaml 框架 -25.参数化数据支持读取外部文件txt/csv/json/…...
C++:多态-重写和重载
重写(Override)和重载(Overload)是面向对象编程中常用的两个概念,它们虽然都涉及到方法的定义,但是在实现和使用上有着不同的特点。 重写(Override): 重写是指在子类中重…...
element ui的table多选
使用el-table的selection-change事件来获取选中的值; 例: html代码: <el-button type"primary" click"openTableSet">列表设置</el-button><!-- 列表设置弹框 --> <el-dialog :close-on-click-mo…...
python基础---基础运算
基础运算 可以使用type获取一个变量的类型 常见的数据类型 整形, 可以存储任意大小的整数, 支持二进制(如0b100,换算成十进制是4)、八进制(如0o100,换算成十进制是64)、十进制(100)…...
【数学】泰勒公式
目录 引言 一、泰勒公式 1.泰勒公式及推导 (1)推导 (2)公式 2.泰勒中值定理 (1)定理1(佩亚诺余项) (2)定理2(拉格朗日余项) …...
C++基础-编程练习题及答案
文章目录 前言一、查找“支撑数”二、数组元素的查找三、爬楼梯四、数字交换五、找高于平均分的人 前言 C基础-编程练习题和答案 一、查找“支撑数” 【试题描述】 在已知一组整数中, 有这样一种数非常怪, 它们不在第一个, 也不在最后一个&…...
React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染
React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染 【免费下载链接】react-native-chart-kit 📊React Native Chart Kit: Line Chart, Bezier Line Chart, Progress Ring, Bar chart, Pie chart, Contribution graph (heatmap) 项目地址:…...
3个关键步骤:在电视盒子上完美运行Armbian系统的终极指南
3个关键步骤:在电视盒子上完美运行Armbian系统的终极指南 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk358…...
如何用3dsconv解决3DS游戏格式兼容问题:从入门到精通的转换指南
如何用3dsconv解决3DS游戏格式兼容问题:从入门到精通的转换指南 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv …...
hadoop+spark+hive基于大数据的食谱分析与个性化推荐系统 美食推荐系统 美食可视化 大数据毕业设计
前言随着互联网技术的快速发展,人们获取信息的方式发生了巨大变化。特别是在食品领域,用户渴望获得更加个性化的推荐服务。大数据分析技术的出现为满足这一需求提供了可能。并据此提供精准的食谱推荐,从而提升用户体验。系统架构设计本项目 采…...
JekyllNet .Net 版本的Jekyll , 你博客 文档的静态生成利器 。
若君只欲一篇而尽知 JekyllNet 今可如何用,此文即其总册。 项目入口 仓库地址:https://github.com/JekyllNet/JekyllNet文档网站:https://jekyllnet.helpGitHub Pages 站点入口(仓库 Pages):https://jekyllnet.github.io/JekyllNe…...
GLM-4.1V-9B-Base多场景落地:医疗影像辅助描述、零售货架识别、文旅导览图解
GLM-4.1V-9B-Base多场景落地:医疗影像辅助描述、零售货架识别、文旅导览图解 1. 模型介绍 GLM-4.1V-9B-Base是智谱开源的一款视觉多模态理解模型,专门针对图像内容识别、场景描述和目标问答等任务进行了优化。这个模型特别擅长处理中文视觉理解任务&…...
C++数组和指针的声明与使用指南
数组声明语法 在 C 中声明数组的语法为: 数据类型 数组名[数组大小]; 示例: int myArray[10]; // 声明一个包含 10 个整数的数组 数组初始化 声明时可直接初始化: int myArray[5] {10, 20, 30, 40, 50}; 部分初始化时,未指定值的…...
博德之门3 Mod管理器:解决Mod加载顺序被重置的终极指南 [特殊字符]
博德之门3 Mod管理器:解决Mod加载顺序被重置的终极指南 🎮 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 如果你在使用BG3ModManager(博德之门3模组…...
【仅限JDK 25 Early Access用户】:隐藏API `LinkerOptions` 强制启用向量化调用的2行代码,实测吞吐提升2.8倍
第一章:Java 25 外部函数接口优化案例Java 25 正式将外部函数与内存 API(Foreign Function & Memory API)从预览特性转为正式特性,显著提升了 JVM 与本地代码交互的安全性、性能与开发体验。相比早期 JNI 方案,FFM…...
如何通过Snap Hutao实现原神游戏决策的智能化?
如何通过Snap Hutao实现原神游戏决策的智能化? 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao …...
