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

news2024/10/4 12:32:05

🎁个人主页:我们的五年

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

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

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

目录

🚗 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.coloradmin.cn/o/1669867.html

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

相关文章

AI地名故事:笔岗村

笔岗村&#xff0c;实际上是由笔村和宏岗村两个古老的村落合并而成的。南宋度宗元年&#xff0c;也就是公元1265年&#xff0c;笔村开始建立。随着时间的推移&#xff0c;到了宋代后期&#xff0c;宏岗村也相继建立。这两个村落各自承载着丰富的历史和文化&#xff0c;最终在历…

(五)STM32F407 cubemx IIC驱动OLED(2)硬件篇

这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。   废话不多说直接开始主题&#xff0c;本人是基于STM32F407VET6芯片&#xff0c;但是意在你看懂这篇文章后&#xff0c;不管是F1,F4,H7等一系列系统硬件IIC配…

HTML5 Canvas发光Loading动画源码

源码介绍 之前我们分享过很多基于CSS3的Loading动画效果&#xff0c;相信大家都很喜欢。今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效。Loading旋转图标是在canvas画布上绘制的&#xff0c;整个loading动画是发光3D的视觉效果&#xff0c;HTML5非常强大。 …

ICode国际青少年编程竞赛- Python-5级训练场-带参数函数

ICode国际青少年编程竞赛- Python-5级训练场-带参数函数 1、 def get_item(a):Dev.step(a)Dev.step(-a) get_item(4) Spaceship.step(2) get_item(2) Spaceship.step(3) get_item(5) Spaceship.step(2) get_item(3) Spaceship.step(3) get_item(4)2、 def get_item(a): D…

【JavaEE网络】HTTP/HTTPS协议的工作原理与格式详解

目录 HTTP/HTTPSHTTP是什么理解“应用层协议”理解HTTP协议的工作过程HTTP协议格式 HTTP/HTTPS HTTP是什么 应用层&#xff0c;一方面是需要自定义协议&#xff0c;一方面也会用到一些现成的协议 HTTP及HTTPS是应用层重点协议 使用浏览器&#xff0c;打开网站&#xff0c;这…

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

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

【C语言 | 数据结构】栈

文章目录 前言1、栈1.1栈的概念和定义1.1.2栈的基本概念&#xff1a; 1.2栈的方法(接口)1.3栈的实现方法1.4栈的性质1.5栈的应用1.6栈的结构 2、栈的实现2.1 顺序栈2.1.1 顺序栈的结构体2.1.2 顺序栈的初始化2.1.3 顺序栈的销毁2.1.4 顺序栈的入栈2.1.5 顺序栈的出栈2.1.5 顺序…

万兆POE网络变压器90W的性能和作用

万兆POE网络变压器GX82405SP-90W是一种应用于网络设备的电力供应器件&#xff0c;它结合了数据传输和电力供应功能&#xff0c;可以为PoE&#xff08;Power over Ethernet&#xff09;设备提供高功率供电。它的性能和作用主要包括&#xff1a; 1. 高功率供电&#xff1a;万兆P…

MyBatis——在WEB中使用MyBatis(MVC架构模式)

一、在 Web 应用中使用 MyBatis 项目目录结构 pojo package org.qiu.bank.pojo;/*** 账户类&#xff0c;封装账户数据* author 秋玄* version 1.0* package org.qiu.bank.pojo* date 2022-09-27-20:31* since 1.0*/ public class Account {private Long id;private String …

邮件代发邮箱API发送邮件时如何正确使用?

邮件代发API发送邮件如何使用&#xff1f;邮件代发的注意事项&#xff1f; 邮件代发邮箱API作为邮件发送的自动化工具&#xff0c;其正确使用对于提高工作效率、保障信息安全具有重要意义。下面&#xff0c;AokSend就来探讨一下在使用邮件代发邮箱API发送邮件时&#xff0c;应…

[数据集][图像分类]抽烟打电话分类数据集6150张3类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;6150 分类类别数&#xff1a;3 类别名称:["normal","phone&…

【JVM基础篇】双亲委派机制介绍

文章目录 双亲委派机制简介案例&#xff1a;自底向上查找案例&#xff1a;自顶向下加载案例&#xff1a;C类在当前程序的classpath中 双亲委派机制的作用如何指定加载类的类加载器&#xff1f;面试题如果一个类重复出现在三个类加载器的加载位置&#xff0c;应该由谁来加载&…

css backdrop-filter 实现背景滤镜

官方给出的定义是&#xff1a;backdrop-filter属性允许您将图形效果&#xff08;如模糊或颜色偏移&#xff09;应用于元素后面的区域。因为它适用于元素后面的所有内容&#xff0c;所以要查看元素或其背景的效果&#xff0c;需要透明或部分透明。 大致分为以下10种&#xff1a…

【基于 PyTorch 的 Python 深度学习】5 机器学习基础(2)

前言 文章性质&#xff1a;学习笔记 &#x1f4d6; 学习资料&#xff1a;吴茂贵《 Python 深度学习基于 PyTorch ( 第 2 版 ) 》【ISBN】978-7-111-71880-2 主要内容&#xff1a;根据学习资料撰写的学习笔记&#xff0c;该篇主要介绍了如何选择合适的激活函数、损失函数和优化器…

【系统架构师】-案例篇(三)NoSQL与分布式对象调用

1、NoSQL 一个基于Web 2.0的大型社交网络系统。就该系统的数据架构而言&#xff0c;李工决定采用公司熟悉的数据架构&#xff0c;使用通用的商用关系型数据库&#xff0c;系统内部数据采用中央集中方式存储。该系统投入使用后&#xff0c;初期用户数量少&#xff0c;系统运行平…

第二证券|北交所股票散户可以买吗?门槛多少?

北交所股票散户能够买&#xff0c;不过一般来说&#xff0c;北交所股票出资风险比较大&#xff0c;不适合资金实力不雄厚的散户。 北交所买卖权限注册条件&#xff1a;请求注册权限前20个买卖日的证券账户和资金账户内的财物日均不低于50万元&#xff0c;其间不包括经过融资融…

【资源分享】完胜谷歌翻译的Deepl翻译

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

【算法】动态规划之背包DP与树形DP

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列 【算法】动态规划之线性DP问题-CSDN博客 【算法】动态规划之背包DP问题&#xff08;2024.5.11&#xff09;-CSDN博客 背包…

银河麒麟服务器操作系统ssh服务无法启动报exit-code

尝试重装ssh服务后依然无法解决&#xff0c;查看日志journalctl -xe&#xff0c;发现可能是ssh配置文件权限问题导致的。 journalctl -xe AWARNING: UNPROTECTED PRIVATE KEY FILE! AA Permissions 0755 for /etc/ssh/ssh_host_rsa_key are too open. A It is required that …

EPAI手绘建模APP工程图工具栏

(2) 工程图工具栏 ① 模板 1) 打开模板选择页面。 图 306 工程图模板列表 2) 模板选择页面列出了可以使用的工程图模板类型&#xff0c;每个模板规定了工程的大小、方向、规格、标准、常用字段等。也包括一些空白模板&#xff0c;此时可以通过添加表格等注释自定义工程图样式…