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

🎁个人主页:我们的五年

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

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

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

目录

🚗 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,一经查实,立即删除!

相关文章

如何利用代理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的结构化流处理和流处理功能&#…

Leetcode-有效的括号

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

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

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

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

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

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

EPICS database练习

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

el-menu 保持展开点击不收缩 默认选择第一个菜单

<el-menu:default-openeds"[/system]" 数组 默认展开第一个:collapse"isCollapse"close"handleClose" 点击关闭的时候 让菜单打开 就可以实现保持展开效果ref"menus":unique-opened"true":active-text-color"se…

2024中国(重庆)人工智能展览会8月举办

2024中国(重庆)人工智能展览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 【报名I59交易会 2351交易会 9466】 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在…

QT 项目打包(为了后期远程实验用)

一、环境准备 1、一个项目工程 二、步骤 1、将编译器设置调整为Release模式 二、对项目重新编译构建 三、可以看到工程目录这个文件夹 打开工程目录文件夹的Release文件夹&#xff0c;我的路径如下 四、新建一个文件夹&#xff0c;将上述路径文件夹下的exe文件复制到新的文…

Windows的消息过程调用与窗口位于同一个线程

消息过程函数和窗口通常在同一个线程中运行。 在Windows中&#xff0c;每个窗口都有一个与之相关联的线程&#xff0c;这个线程负责处理窗口的消息。当窗口接收到消息时&#xff0c;系统会将消息发送给创建窗口的线程&#xff0c;并在该线程上调用窗口过程函数来处理消息。 这…

领导跳槽邀请,测试员该如何抉择?

在职场中&#xff0c;领导跳槽并邀请下属一同前往新公司&#xff0c;是一个既常见又令人纠结的选择。对于测试员来说&#xff0c;这个决定更是充满了未知与风险。那么&#xff0c;面对这样的机会&#xff0c;我们该如何权衡利弊&#xff0c;做出明智的选择呢&#xff1f; 首先&…

你眼中的IT行业现状与未来趋势

一&#xff1a;阐述 现在IT、科技行业从业人员开始求稳&#xff0c;部分从业人员开始转向DBA、运维&#xff08;企业相当稳定&#xff09;、硬件工程师等&#xff08;技术过硬&#xff0c;不是随便可以转的&#xff09;&#xff0c;但是这些行业职位少&#xff0c;薪水相对不是…

LLM大语言模型(十四):LangChain中Tool的不同定义方式,对prompt的影响

背景 ChatGLM3-6B的函数调用功能&#xff0c;和LangChain的Tool调用&#xff0c;在prompt上并没有对齐。 参考&#xff1a;LLM大语言模型&#xff08;十二&#xff09;&#xff1a;关于ChatGLM3-6B不兼容Langchain 的Function Call_error: valueerror: caught exception: unk…

神卓互联内网穿透之快速创建https类型通道【最新】

神卓互联最近上线了V9.0内网穿透通信传输模式&#xff0c;相比与之前的V8.0在速度和延迟方面确实提升了很多&#xff0c;控制台也进行了改版升级&#xff0c;这里是对升级后的控制台创建https通道方法进行记录&#xff1a; 登录神卓互联控制台 选择【内网穿透】-【映射管理】…

如何利用AI提高内容生产效率与AIGC典型案例分析

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