【数据结构课程学习】:队列学习

🎁个人主页:我们的五年

🔍系列专栏:数据结构课程学习

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

目录

🚗 1.队列的基本概念:

 🚗2.判断队列使用哪种数据结构实现:

🚗3.队列的结构:

🚗4.队列初始化:

🚗5.队列销毁:

🚗6.队列尾插:

🚗7.队列头部删数据:

🚗8.取队头,队尾元素:

🚗9.队列判空:

🚗10.整体函数:


🚗 1.队列的基本概念:

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头。

 🚗2.判断队列使用哪种数据结构实现:

像栈一样,我们只要在栈顶插入数据,在栈顶删除数据,取栈顶的元素。这些过程中,用数组实现不需要去整体移动数,这样我们就选择数组实现。

但是,如果我们用数组实现队列,当出队列的时候,我们就要把剩下的数据整体往前面移动一位,这样就会很麻烦。如果我们使用链表,就会不需要去移动数据。

注意:

其实,栈和队列都可以用数组和链表实现,栈也可以用链表,队列也可以用数组。只是实现栈的时候用数组更好,实现队列的时候用链表更好。

🚗3.队列的结构:

typedef struct QueueNode {
            struct QueueNode* next;
            QDataType x;
}QNode;

typedef struct Queue {
            QNode* phead;
            QNode* ptail;
            int size;
}Queue;

⛷QueueNode表示一个节点,里面存着数据,和下个节点的指针,多个节点也就形成了链表。

⛷因为我们要进行头删和尾插,所以我们必须要有头节点,但是如果没有尾节点,我们每次尾插都要遍历链表,这样时间复杂度就变成了O(N),如果我们在队列里加入尾节点,这样时间复杂度就是O(1)。

⛷头删过程中,头节点会改变,我们就得使用二级指针,但是我们如果用结构体,就可以避免了使用二级指针。

⛷另外,我们增加size表示节点个数,也可以降低队列函数实现得难度。

🚗4.队列初始化:

//初始化队列
void QueueInit(Queue* ps)
{
            assert(ps);        //队列判空
            ps->phead =ps->ptail= NULL;
            ps->size = 0;    //队列个数
}

🚗5.队列销毁:

//队列销毁
void QueueDestroy(Queue* ps)
{
            assert(ps);
            while (ps->phead)
            {
                       QNode* next = ps->phead->next;
                        free(ps->phead);
                        ps->phead = next;
                        ps->size--;
    }
}

🚗6.队列尾插:

//队列尾部插入数据
void QueuePush(Queue* ps,QDataType x)
{
            assert(ps);
            QNode* node = (QNode*)malloc(sizeof(QNode));
            assert(node);
            node->x = x;
            node->next = NULL;
            if (ps->size == 0)
            {
                        ps->phead = ps->ptail = node;
                        ps->size++;
            }
            else
            {
                        ps->ptail->next = node;
                        ps->ptail = node;
                        ps->size++;
            }
}

🚗7.队列头部删数据:

void QueuePop(Queue* ps)
{
            assert(ps);
            if (ps->size == 0)        //队列为空的情况
                return;
            else if (ps->size == 1)        //队列只有一个数据的时候,删除数据以后,要把phead和ptail同时置为空,不然只把一个置为NULL,那么另外一个就变成野指针了。
            {
                        free(ps->phead);
                        ps->phead = ps->ptail = NULL;
                        ps->size--;
            }
            else
            {
                        QNode* next = ps->phead->next;
                        free(ps->phead);
                        ps->phead = next;
                        ps->size--;
            }
}

❗️注意:

队列为空,队列只有一个元素,队列有多个元素三种情况要分开考虑,因为如果把队列只有一个元素的情况放在多个元素的情况下一起处理,那么只有ps->phead变成了NULL,ps->ptail还没有置为NULL,这样ps->ptail就变成了野指针。

🚗8.取队头,队尾元素:

//取队头元素
QDataType QueueTop(Queue* ps)
{
            assert(ps);
            assert(ps->phead);
            return ps->phead->x;
}

//取队尾元素
QDataType QueueBack(Queue* ps)
{
            assert(ps);
            assert(ps->phead);
            return ps->ptail->x;
}

🚗9.队列判空:

//队列判空,为空返回true,不为空返回false
bool QueueEmpty(Queue* ps)
{
    assert(ps);
    return ps->size == 0;
}

🚗10.整体函数:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>typedef int QDataType;typedef struct QueueNode {struct QueueNode* next;QDataType x;
}QNode;typedef struct Queue {QNode* phead;QNode* ptail;int size;
}Queue;//初始化队列
void QueueInit(Queue* ps);//摧毁队列
void QueueDestroy(Queue* ps);//先进后出,尾插数据
void QueuePush(Queue* ps, QDataType x);//头部删除数据
void QueuePop(Queue* ps);//取队头元素
QDataType QueueTop(Queue* ps);//取队尾元素
QDataType QueueBack(Queue* ps);//队列判空,为空返回true,不为空返回false
bool QueueEmpty(Queue* ps);#include"Queue.h"//初始化队列
void QueueInit(Queue* ps)
{assert(ps);ps->phead =ps->ptail= NULL;ps->size = 0;	//队列个数
}//队列销毁
void QueueDestroy(Queue* ps)
{assert(ps);while (ps->phead){QNode* next = ps->phead->next;free(ps->phead);ps->phead = next;ps->size--;}
}//队列尾部插入数据
void QueuePush(Queue* ps,QDataType x)
{assert(ps);QNode* node = (QNode*)malloc(sizeof(QNode));assert(node);node->x = x;node->next = NULL;if (ps->size == 0){ps->phead = ps->ptail = node;ps->size++;}else{ps->ptail->next = node;ps->ptail = node;ps->size++;}
}//删除队头元素
void QueuePop(Queue* ps)
{assert(ps);if (ps->size == 0)return;else if (ps->size == 1){free(ps->phead);ps->phead = ps->ptail = NULL;ps->size--;}else{QNode* next = ps->phead->next;free(ps->phead);ps->phead = next;ps->size--;}
}//取队头元素
QDataType QueueTop(Queue* ps)
{assert(ps);assert(ps->phead);return ps->phead->x;
}//取队尾元素
QDataType QueueBack(Queue* ps)
{assert(ps);assert(ps->phead);return ps->ptail->x;
}//队列判空,为空返回true,不为空返回false
bool QueueEmpty(Queue* ps)
{assert(ps);return ps->size == 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/11251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考高级最容易被挂掉的论文,千万别乱写!

高级考生最没把握的科目应该就是论文了&#xff0c;有些考生考了几次都败在论文上了。那么导致论文不合格的写作误区有哪些&#xff1f;最后十多天&#xff0c;该如何准备呢&#xff1f; 常见写作误区 误区一&#xff1a;偏题 在论文写作时不能偏题&#xff0c;要紧扣子题干…

Visual Studio构建NodeJS原生代码在Electron中的报错问题

文章目录 对比NODE-GYP工具解决问题进一步研究win_delay_load_hook.cc代码MAC中是不需要这个东西的这个标题有点长,相对是一个比较具体的场景,但是这个问题在我自己的实际开发中,确实困扰了我一段时间。 因为在windows下做设备驱动,上位机的开发中。Visual Studio是一个比较…

要想通过等保测评,这7个问题你必须了解

1.什么是等级保护测评&#xff1f; 2.为什么要做等级保护测评&#xff1f; 3.等保1.0与2.0的区别在哪里&#xff1f; 4.等级保护测评参考标准有哪些&#xff1f; 5.等级保护测评的级别有哪些以及哪些系统需要&#xff1f; 6.等保测评的主要内容是什么&#xff1f; 7.等级…

如何利用代理IP高效采集全球热点,赋能短视频创作?

如何利用代理IP高效采集全球热点&#xff0c;赋能短视频创作&#xff1f; 一、摘要二、代理IP1. 什么是代理IP&#xff1f;2. 代理IP的分类3. 代理的重要性 三、如何选择可靠的代理IP服务商&#xff1f;四、IPIDEA代理IP简介1.IPIDEA简介2.IPIDEA的优势 五、获取代理IP1. 注册平…

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词&#xff0c;以及random库来随机选择单词。 使用after方法来定时更新窗口的位置&#xff0c;实现单词窗口的慢慢移动效果 使用…

有机硅改性氟树脂性能进一步提升 市场需求增长空间大

有机硅改性氟树脂性能进一步提升 市场需求增长空间大 有机硅改性氟树脂&#xff0c;利用有机硅树脂对氟树脂进行改性得到一种新型的、性能更为优异的树脂材料。 有机硅树脂&#xff0c;具有柔韧性好、电绝缘、憎水、耐候、耐老化等优点&#xff0c;但固化温度高且时间长、附着力…

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移

使用Apache Spark从MySQL到Kafka再到HDFS的数据转移 在本文中&#xff0c;将介绍如何构建一个实时数据pipeline&#xff0c;从MySQL数据库读取数据&#xff0c;通过Kafka传输数据&#xff0c;最终将数据存储到HDFS中。我们将使用Apache Spark的结构化流处理和流处理功能&#…

MySQL中表的插入,修改,删除语法

插入 插入数据有四种方法,代码如下 -- 给表中添加元素 -- insert into 表名 (列名) values(数据)INSERT INTO student(NAME,gender,birthday,phone)VALUES(张三,男,2003-2-10,13333333333) INSERT INTO student(NAME,gender,birthday,phone,address,height,rig_time) VALUES(…

在Mac环境下打包Python应用

1、创建虚拟环境 conda create -n ur_name python3.7 pip install -r requirement.txt 2、配置文件生成 cd ur_project py2applet --make-setup __main__.py 3、APP打包 # 编辑setup.py文件,具体参考本文文献 python setup.py py2app 用 py2app 将 Python 脚本打包成 Mac…

高级优化理论与方法(十二)

高级优化理论与方法&#xff08;十二&#xff09; LPDuality of LPWeek LP Duality TheoremStrong LP Duality TheoremCorollary Complementary Slackness ConditionRemarksExample Non-Simplex MethodsKhachiyan (Ellipsoid)Karmarkar (Interior point) Integer Linear Progra…

Leetcode-有效的括号

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/valid-parentheses/ 题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&…

MongoDB 数据探索之道:查询文档操作详解

在 MongoDB 数据库中&#xff0c;查询文档是一种强大的工具&#xff0c;能够帮助您深入了解数据并提取所需信息。无论是从大型数据集中检索特定记录&#xff0c;还是进行数据统计和分析&#xff0c;查询文档都是不可或缺的。在本指南中&#xff0c;我们将深入探讨 MongoDB 查询…

c++ map,set封装

map 是一个 kv 结构&#xff0c; set 是 k结构。 我们前面模拟实现了 红黑树&#xff0c;但是我们实现的红黑树把 kv 结构写死了&#xff0c;怎么样才能用泛型编程的思想来实现map和set呢 我们先简单看一下原码中是怎么实现的 1.原码实现逻辑 我们打开这里的 stl_set.h 通过…

Dubbo基本使用

Dubbo基本使用 1.项目介绍2.开发步骤2.1 启动注册中心2.2 初始化项目2.3 添加 Maven 依赖2.3.1 父pom.xml2.3.1 consumer模块和provider模块pom.xml 2.4 定义服务接口2.5 定义服务端的实现2.6 配置服务端 Yaml 配置文件2.7 配置消费端 Yaml 配置文件2.8 基于 Spring 配置服务端…

芯片原厂工程师带你学 Linux 驱动

芯片原厂工程师&#xff0c;手把手带你学Linux驱动&#xff0c;感兴趣的点个关注私聊呀。 介绍&#xff1a; https://b2qtatgfkp.feishu.cn/docx/HoBKdezVFo6HlVx0hXPc8R7QnWc

Mysql sql_mode=only_full_group_by时如何实现根据单个字段分组

SELECT* FROMTABLE_NAME t group by device_id ORDER BY create_time desc报错 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column TABLE_NAME.t.id which is not functionally dependent on columns in GROUP BY clause; this is …

JINGWHALE 数字认证体系 · 进阶知识库

JINGWHALE 数字认证体系 是 JINGWHALE 数字科学艺术创新中心 的数字认证服务。 ◢◤ 宗旨 致力于数字化知行合一的知识赋能&#xff01; ◥ 数字化人才培养 培养数字化思维&#xff0c;传播数字化知识&#xff0c;赋能各行业数字化。 ◥ 职业人才发展 无缝衔接学校高等…

LeetCode题目104: 二叉树的最大深度(递归\迭代\层序遍历\尾递归优化\分治法实现 )

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

百度地图提供的微信小程序的功能少到让我想跳楼

呜呜呜。 为什么uni-app使用vue-baidu-map然后启动在微信开发者工具就会有一大堆不明所以的报错啊

EPICS database练习

给定一个以下的数据库&#xff1a; # 指定Limit的上限&#xff0c;初始为10&#xff0c;可以通过通道访问进行设置&#xff0c;上限为100 record(ao, "$(P)Limit") { field(DRVH, "100") field(DOL, "10") field(PINI, "YES") }# 一个…