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

🎁个人主页:我们的五年

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

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

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

目录

🚗 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

xCode升级后: Library ‘iconv2.4.0’ not found

报错信息&#xff1a; targets 选中 xxxNotification: Build Phases ——> Link Binary With Libraries 中&#xff0c;移除 libiconv.2.4.0.tbd libiconv.2.4.0.dylib 这两个库&#xff08;只有一个的移除一个就好&#xff09;。 然后重新添加 libiconv.tbd 修改完…

开发者集结号:大湾区 Open Source Day 邀您共探技术前沿

开源技术正以其开放、协作的特性&#xff0c;引领着软件开发的新潮流&#xff0c;是推动社会进步的重要力量。作为开发者&#xff0c;您是否渴望深入了解开源项目的前沿动态&#xff1f;由ALC深圳与2024中国互联网发展创新与投资大赛联合举办、FISCO金链盟深度参与的大湾区 Ope…

第五十二周:文献阅读+STHTNN

目录 摘要 Abstract 文献阅读&#xff1a;用于区域空气质量预测的时空分层传输神经网络 现有问题 提出方法 创新点 方法论 周期特征提取组件(PFEC) 场景动态图模块(SDGM) 时空特征提取组件&#xff08;STEC) 传输注意力模块(TransATT) STHTNN模型 研究实验 数据集…

基于微信小程序的预约挂号系统(源码)

博主介绍&#xff1a;✌程序员徐师兄、10年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447…

AI算法-高数5.1-线性代数-向量定义、表示和向量间的关系

看线性代数这篇文章&#xff08;AI算法-高数5-线性代数1-基本概念、向量-CSDN博客&#xff09;理解有些吃力的朋友们&#xff0c;可以先学下宋浩老师的这些课程。 宋浩老师&#xff1a; 3.1 n维向量及其运算_哔哩哔哩_bilibili 3.2 向量间的线性关系&#xff08;一&#xff…

程序员如何避免35岁危机?

所谓的“35岁危机”通常是指在职业生涯中遇到的一个挑战阶段&#xff0c;这个概念在不同行业和个人中有不同的体现。对于程序员来说&#xff0c;这可能与技术更新迅速、工作强度大、职业发展路径的不确定性等因素有关。 以下是一些建议&#xff0c;帮助程序员避免或缓解这一危机…

HTML5实现简洁好看的个人主页,个人小站(多种风格附源码)

文章目录 1.烟灰主题个人主页1.1 个人主页界面1.2 个人信息界面1.3 兴趣爱好界面1.4 个人作品界面 2.紫霞主题个人主页2.1 个人主页界面2.2 个人信息界面2.3 兴趣爱好界面2.4 个人作品界面 3.墨夜主题个人主页3.1 个人主页界面3.2 个人信息界面3.3 兴趣爱好界面3.4 个人作品界面…

把3D模型加载到网页上需要什么技术?

要将3D模型加载到网页上并实现交互展示需求&#xff08;比如点击模型弹出一个窗口或控制模型的材质等&#xff09;&#xff0c;可以使用以下几种技术&#xff1a; 1、Three.js&#xff1a;这是一个非常流行的JavaScript库&#xff0c;用于在网页上渲染和显示3D图形。它支持多种…

Python-VBA函数之旅-super函数

目录 一、super函数的常见应用场景 二、super函数使用注意事项 三、如何用好super函数&#xff1f; 1、super函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、su…

【Linux系统编程】第十七弹---进程理解

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程的基本概念 2、描述进程-PCB 2.1、什么是PCB 2.2、为什么要有PCB 3、task_ struct 3.1、启动进程 3.2、创建进程…

Redis五大基本数据类型介绍及其使用场景

文章目录 1 String&#xff08;字符串&#xff09;应用场景 2 List&#xff08;列表&#xff09;应用场景 3 Set&#xff08;集合&#xff09;4 sorted set&#xff08;有序集合&#xff09;应用场景 5 hash&#xff08;哈希&#xff09;应用场景 Redis 是一个开源&#xff0c;…

2D已经不能满足可视化大屏胃口了,不搞3D都不好意思出门打招呼。

相较于2D形式&#xff0c;3D形式在可视化大屏有很多优势 深度感和逼真度&#xff1a; 3D形式可以通过透视和阴影效果给人以更真实的感觉&#xff0c;增加了可视化数据的深度感&#xff0c;使数据更加生动和具有立体感。 空间关系的展示&#xff1a; 3D形式可以更好地展示数据…

WMS系统批次管理概述

为了提高仓库运作效率&#xff0c;降低库存成本&#xff0c;越来越多的企业开始引入WMS仓库管理系统&#xff0c;WMS系统批次管理作为其核心功能之一&#xff0c;对于实现精细化、智能化的仓储管理具有重要意义。 二、WMS系统批次管理概述 WMS系统批次管理是指通过对仓库中的货…

点阵字库介绍

1、点阵字库介绍 首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道 的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在 PC 机…

开散列哈希桶

通过上面这幅图&#xff0c;读者应该能较为直观地理解何为开散列&#xff0c;以及闭散列与开散列的区别在哪里 —— 数据的存储形式不同&#xff0c;至于其他的&#xff0c;如确定每个元素的哈希地址等一概相同。 与闭散列相比&#xff0c;开散列能够更好地处理发生冲突的元素 …

【网站项目】SpringBoot792考试系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

css背景图片,在不同的分辨率下,显示不全

问题背景 今天遇到一个很奇怪的问题&#xff0c;css背景图&#xff0c;在同事电脑上&#xff0c;显示不全 正常应该是这样的 分析原因 首先我们来看下之前的代码 .dtc-logo{width 91pxmin-width 91pxheight 55pxbackground url(https://xxxx/image/xxxx.png)background-size…

MySQL————创建存储过程函数

存储过程使用大纲 有参数传递 delimiter $$ 声明一个名称为get_student_introduce create procedure add_student_infor( in p_userName VARCHAR(20),in p_phone VARCHAR(11),in p_sex char(2),in p_introduce VARCHAR(255)) 开始操作 BEGIN 撰写真正在操作DMLDQL都行 INSE…

NL6621 WIFI模块烧录及其他

某宝淘得NL6621: 测了一下引脚&#xff1a; 做了以下功课&#xff1a; 新岸线物联网NL6621解决方案是高性价比、完全开源、高成熟度的解决方案&#xff0c;特别为高数据吞吐率低成本的无线局域网产品而设计。它集成了MCU&#xff0c; MAC&#xff0c;1T1R基带和带功放RF收发机于…

PyWebIO,用 Python 写网站

在Python的世界里&#xff0c;PyWebIO是一个简单而强大的库&#xff0c;它能让你的Python脚本快速拥有一个交互式的网页界面。想象一下&#xff0c;你不需要懂得前端开发&#xff0c;就能创建出用户友好的网页应用&#xff0c;这是多么酷的一件事&#xff01;今天&#xff0c;我…