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

一起学数据结构(6)——栈和队列

上篇文章中,对栈的概念及特点进行了解释,并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。

1. 队列的概念及结构:

在给出队列的概念之前,先给出上篇文章中提到的栈的概念:一种只能在表尾进行插入和删除的线性表。

对于队列,与栈相同的一点是,依然只能在表尾插入数据。但是,队列只允许在表头删除数据。

进行插入操作的一端,称之为队尾。将插入数据的操作称之为入队列。

进行删除数据的一段,称之为对头。将删除数据的操作称之为出队列。

队列整体结构可以有下图反应:
2. 队列的代码实现:

2.1 队列结构的定义:

通过结构体定义下放给的队列结构:

typedef int QDataType;
typedef struct QueueNode
{struct QueueNode* next;QDataType data;
}QNode;

在后续的操作中,需要通过向所编写的功能函数中传递两个结构体指针phead,tail来分别表示队头、队尾来达到头删、尾插的目的。例如在进行插入时,插入第一个数据时,pheadtail均指向第一个数据。即:

只有插入的元素数量>1时,pheadtail两个指针才会拉开差距。例如:插入3个元素时,大致效果如下:

所以,在后续操作时,需要改变pheadtail两个指针中的内容。在之前关于单链表的文章中一起学数据结构(3)——万字解析:链表的概念及单链表的实现_起床写代码啦!的博客-CSDN博客提到,当一级指针phead,tail作为形式参数时,函数内部对于形式参数的更改,并不会影响这两个指针中实际保存的内容。解决这个问题的方法, 在之前的文章中曾提到过下面几种:
1. 通过传递关于phead,tail二级指针来达到改变着两个指针中存储内容的目的。

2.在书写函数时,最后直接返回形参。并且在外部创建变量来记录函数的返回值。

本文提供第三种方法,即再额外创建一个结构体来存储phead,tail这两个指针。并且将这个结构体的指针作为形参传递到函数中。即:

typedef struct Queue
{QNode* phead;QNode* tail;int size;
}Que;

如果想更改phead中存储的内容,只需要命名一个结构体指针,例如:Que*ps。通过ps-> phead可以达到目的。

对于上面提出的用结构体封装两个指针的方法,也可以看作关于带头结点的双向循环链表文章一起学数据结构(4)——带头结点的双向循环链表_起床写代码啦!的博客-CSDN博客

中哨兵位头结点的作用。

2.2 队列初始化:

将结构体Que中各个结构体成员初始化,代码如下:

void QueueInit(Que* ps)
{assert(ps);ps->phead = ps->tail = 0;ps->size = 0;
}

2.3 向队列中插入元素:

与通过栈顶向栈中插入元素的思路大致相同,首先需要进行扩容。但是因为在实现栈时,是采用顺序实现。而对于本文的队列则采用链式实现。所以,在栈中开辟空间时,是开辟一部分连续空间。当这部分空间被占满时再开辟。对于链式结构,只需要,在每次插入之前,开辟一个单独的结点即可。具体代码如下:
 

void QueuePush(Que* ps, QDataType x)
{assert(ps);QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc");exit(-1);}newnode->next = NULL;newnode->data = x;if (ps->tail == NULL){ps->phead = ps->tail = newnode;}else{ps->tail->next = newnode;ps->tail = newnode;}ps->size++;
}

2.3 删除队列中的元素:

在文章的前面提到,队列的特点是尾部插入元素、头部删除元素、先进先出。所以,对于删除队列中的元素,只需要先将phead指向下一个结点。但是需要注意,当队列中只有一个结点时,当free掉该结点时,需要处理phead,tail这两个指针。具体代码如下:
 

void QueuePop(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));if (ps->phead->next == NULL){free(ps->phead);ps->phead = ps->tail = NULL;}else{QNode* next = ps->phead->next;free(ps->phead);ps->phead = next;}ps->size--;
}

2.4 取队列的队头、队尾元素:

直接通过指针返回队头、队尾的元素即可,只给出代码,不做多余解释:

QDataType QueueFront(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->phead->data;
}QDataType QueueBack(Que* ps)
{assert(ps);assert(!QueueEmpty(ps));return ps->tail->data;
}

2.5 探空:

原理与栈中的探空结构相同,只给出代码,不做多余解释:

bool QueueEmpty(Que* ps)
{assert(ps);return ps->phead == NULL;
}

2.6 统计长度:

在前面的删除元素、删除元素的功能中,每进行一次变动,都会有size进行相应的变动。所以,统计长度这部分,直接返回size即可。代码如下:

int QueueSize(Que* ps)
{assert(ps);return ps->size;
}

2.7 删除栈:

与删除单链表原理相同,先创建一个变量cur存储队列的头指针,通过while循环进行删除,对于删除的过程,首先创建一个变量用于存储cur->next,再free(cur),最后让cur存储next中存储的地址。最后将phead,tail,size全部置为NULL或者0即可。代码如下:

void QueueDestory(Que* ps)
{assert(ps);QNode* cur = ps->phead;while (cur){QNode* next = cur->next;free(cur);cur = next;}ps->phead = ps->tail = NULL;ps->size = 0;
}

3. 队列功能测试:

通过下面的测试代码,对队列的功能进行测试:
 

void TestQueue()
{Que ps;QueueInit(&ps);QueuePush(&ps, 1);QueuePush(&ps, 2);QueuePush(&ps, 3);QueuePush(&ps, 4);while (!QueueEmpty(&ps)){printf("%d", QueueFront(&ps));QueuePop(&ps);}QueueDestory(&ps);}int main()
{TestQueue();return 0;
}

结果如下:







 

相关文章:

一起学数据结构(6)——栈和队列

上篇文章中,对栈的概念及特点进行了解释,并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构: 在给出队列的概念之前,先给出上篇文章中提到的栈的概念:一种只…...

【数据结构】二叉树的顺序结构-堆

【数据结构】二叉树的顺序结构-堆 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间…...

2024年java面试--mysql(2)

系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇2024年java面试–集合篇2024年java面试–redi…...

IllegalArgumentException

Caused by: java.lang.IllegalArgumentException:Invalid pulsar service : persistent 参数非法异常 这个异常是由于使用了无效的 Pulsar 服务类型导致的。Pulsar 支持不同的服务类型,例如 persistent、non-persistent 等。 当你在配置 Pulsar 相关的参数时&…...

Git 概述命令、idea中的使用

目录 Git概述 Git代码托管服务 Git常用命令 Git 全局设置 获取 Git 仓库 ​编辑Git 工作区中文件的状态 本地仓库操作 远程仓库操作 ​编辑分支操作 标签操作 在IDEA中使用Git 1.获取Git仓库 .gitignore 表示忽略 2.本地仓库操作 3.远程仓库操作 4.分支操作 Git是…...

单片机之硬件记录

一、概念 VBAT 当使用电池或其他电源连接到VBAT脚上时,当VDD断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。 VCC:Ccircuit 表示电路的意思,即接入电路的电压&#x…...

QQ文件传输协议研究

引言 我们都知道,现在越来越多的应用采取了 HTTPS or TLS 传输协议,对于一般的协议,我们可以使用中间人技术对流量进行劫持转发,从而破解密文,这边可以参见我的另外一篇文章基于加密邮件协议的中间人攻防实战, 而对于 HTTPS 应用即使是我们采取中间人技术,也很难让浏览器…...

Qt/C++音视频开发51-推流到各种流媒体服务程序

一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不…...

LeetCode 35. 搜索插入位置

题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 该题我们可以采用二分查找的方式,我们可以把数组分为,小于target的一边儿和大于等于target的一边儿。 当midleft(right-left)下标所对应的数大于等于targ…...

7年经验之谈 —— Web测试是什么,有何特点?

Web测试是指对Web应用程序进行验证和评估的过程,以确保其功能、性能和安全性符合预期。 Web测试具体包括以下几个方面的内容: 功能测试:验证Web应用程序是否按照需求规格说明书中定义的功能正常工作。功能测试包括输入验证、表单提交、页面…...

【数据结构】前言概况 - 树

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:数据结构 🔥该文章针对树形结构作出前言,以保证可以对树初步认知。 目录: 🌍前言:&#x1f3…...

MySQL——事务

一、事务的开始与结束 一个数据库事务由一条或多条sql语句构成,它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功,要么全部执行失败。 1.1.事物的开始 1.对于DDL(create,alter,drop)和DCL&…...

虚拟机Ubuntu操作系统最基本终端命令(安装包+详细解释+详细演示)

虚拟机及乌班图(Ubuntu操作系统) 提示:大家需要软件的可以直接在此链接中提取 链接:https://pan.baidu.com/s/1_4VHGTlXjIuVhBINeOuBCA 提取码:nd0c 文章目录 虚拟机及乌班图(Ubuntu操作系统)终…...

Android 11.0 当系统内置两个Launcher时默认设置Launcher3以外的那个Launcher为默认Launcher

1.概述 在11.0定制化开发中,由于产品开发需要要求系统内置两个Launcher,一个是Launcher3,一个是自己开发的Launcher,当系统启动Launcher时, 不要弹出Launcher选择列表 选择哪个Launcher要求默认选择自己开发的Launcher作为默认Launcher,关于选择Launcher列表 其实都是在Res…...

NO5.心愿打印机

def light():#定义一个函数,以:结尾print(红灯2)#打印print(绿灯3)#打印 print(黄灯1)#和def顶格,先执行 light()#调用light函数【PDF转Word】 https://fzqxk86ywz.feishu.cn/sheets/GugIsI9zKhNaEwtJscbcgKFCn6b 【Fiddler汉化】 https://fzqxk86ywz.f…...

cudart.so vs cuda.so的区别

libcuda.so provides access to the CUDA driver API, whereas libcudart.so provides access to the CUDA runtime API. libcuda.so提供对CUDA驱动程序API的访问,而libcuart.so提供了对CUDA运行时API的访问。 在wsl中cuda.so位于/usr/lib/wsl/lib/libcuda.so 可以…...

Oracle集群管理-19C集群禁用numa和大页内存特性

Linux Redhat 7.9关闭内存管理特性 1 关闭大页内存 [rootdb1 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag [always] madvise never [rootdb1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never echo never > /sys/kernel/mm/transpare…...

题目:2726.使用方法链的计算器

​​题目来源: leetcode题目,网址:2726. 使用方法链的计算器 - 力扣(LeetCode) 解题思路: 按要求模拟,在计算后返回自己以达到链式调用的目的。 解题代码: class Calculator {/**…...

基于ASP.NET的驾校管理系统设计与实现

摘 要 伴随国民经济的飞速发展和人民生活水平的不断提高,家用汽车在我国逐渐普及。面对不断增长的庞大的用户群,随之产生的驾驶培训行业,规模不断扩大。近年来,随着Internet的迅速发展以及网页制作技术的日臻完善,驾校…...

第一章 计算机系统概述 三、操作系统的发展与分类

一、手工操作阶段 缺点:人机速度矛盾 二、批处理阶段 1、单道批处理系统(引入脱机输入输出技术) 优点:缓解人机速度矛盾 缺点:资源利用率依然很低 2、多道批处理系统(操作系统开始出现) 优点:多道程序并发进行,…...

【2023年11月第四版教材】第12章《质量管理》(第二部分)

第12章《质量管理》(第二部分) 4 规划质量管理4.1 数据收集★★★4.2 数据分析★★★4.3 数据表现★★★4.4 质量管理计划★★★4.5 质量测量指标★★★ (22下35) 4 规划质量管理 组过程输入工具和技术输出计划1.规划质量管理1.项…...

metinfo __ 6.0.0 __ file-read

metinfo __ 6.0.0 __ file-read 说明内容漏洞编号–漏洞名称MetInfo 6.0.0 任意文件读取漏洞漏洞评级高危影响范围6.0.0.0漏洞描述MetInfo 存在任意文件读取漏洞,攻击者利用该漏洞,在具有权限的情况下,可以读取网站任意文件,包括…...

打造高效的私密论坛网站:Cpolar内网穿透+HadSky轻量级搭建指南

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置)2.4 公网访问测试 总结 前言 经过多年的基础…...

MediaCodec源码分析 configure流程

前言 本文梳理MediaCodec configure流程,基于7.0代码,这里只分析AVC和HEVC的视频硬解,流程图如下。 代码见: frameworks/base/media/java/android/media/MediaCodec.java frameworks/base/media/jni/android_media_MediaCodec.h frameworks/base/media/jni/android_media_…...

借助ChatGPT使用Pandas实现Excel数据汇总

一、问题的提出 现在有如下一个Excel表: 上述Excel表中8万多条数据,记录的都是三年以来花菜类的销量,现在要求按月汇总实现统计每个月花菜类的销量总和,如果使用Python的话要给出代码。 二、问题的解决 1.首先可以用透视表的方…...

[学习笔记]PageRank算法

参考资料:改变世界的谷歌PageRank算法 pagerank算法用于计算节点重要度 思想 如果网页被更多的入度(被引用),则网页更重要。 被重要网站引用比被普通网站引用更加凸显重要性。 所以考虑一个网站是否重要,需要看引用它的网站是否重要&#…...

【洛谷算法题】P5704-字母转换【入门1顺序结构】

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5704-字母转换【入门1顺序结构】🌏题目描述🌏输入格式&a…...

Pytorch——查找、替换module相关操作

nn.Module类可用操作 1. model.named_parameters() # 遍历模型的所有参数并打印它们的名称和形状 for name, param in model.named_parameters():print(f"Parameter Name: {name}, Parameter Shape: {param.shape}")输出示例: Parameter Name: conv1.w…...

组件安全以及漏洞复现

组件安全 1. 概述 A9:2017-使⽤含有已知漏洞的组件 A06:2021-Vulnerable and Outdated Components ​ 组件(例如:库、框架和其他软件模块)拥有和应用程序相同的权限。如果应用程序中含有已知漏洞的组件被攻击者利用,可能会造成…...

人工智能安全-4-小样本问题

0 提纲 小样本学习问题数据增强基于模型的小样本学习基于算法的小样本学习相关资源1 小样本学习问题 在小样本监督分类中,通常将问题表述为 N-way-K-shot分类, 当K = 1,称为one-shot learning;当K = 0时,成为zero-shot learning(ZSL)。ZSL就要求学习的问题具备充足的先…...

南昌比较好的网站设计/网站seo收录工具

springBoot的2.x版本与springCloud的H版本 版本对应关系:版本查看地址...

做视频投稿赚钱的网站好/网络推广需要花多少钱

这个例程比较简单,写这篇博客主要时为了做一些简单的记录,以防止后面遇到浪费不必要的时间。 这个例程包含读入CSV数据,对数据进行归一化处理,然后创建简单的神经网络,训练然后预测。 package org.deeplearning4j.…...

实用网站建设知识点/软文推广300字

1.1. 序列化 org.apache.hadoop.io包 序列化:将一个对象编码为一个字节流 反序列化:相反过程 用途: 1、 作为一种持久化格式:可存储在硬盘上,供以后反序列化使用 2、 作为一种通信数据格式:可在JVM之间&…...

防疫网站网页设计/网络营销推广8种方法

词向量模型 Word2Vec Skip-gram 模型是图嵌入模型 Random Walk 中要使用到的模型,因此先学习 Word2Vec 神经网络语言模型 NNLM 目标:根据给定的词序列,预测下一个会出现的词,如给定 “他”,“是”,“一个…...

推广方法及策略/吉安seo招聘

导读热词下面是编程之家 jb51.cc 通过网络收集整理的代码片段。编程之家小编现在分享给大家,也给大家做个参考。String body"this is sms demo";Intent mmsintent new Intent(Intent.ACTION_SENDTO,Uri.fromParts("smsto",number,null));mmsin…...

腾讯建站平台官网/百度竞价培训

如何打开文件Stud.txt,然后用"Orange"替换任何出现的"A"? 请(一如既往)遵循一般问题指南,说明任何特殊限制,显示您迄今为止尝试过的内容,并询问具体让您感到困惑的内容。 另外,请用[ho…...