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

🎁个人主页:我们的五年

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

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

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

目录

🚗 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.rhkb.cn/news/326301.html

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

相关文章

[muduo网络库]——muduo库的Reactor模型(剖析muduo网络库核心部分、设计思想)

一、前言 在学习 C 服务端的过程中&#xff0c;必不可少的一项就是熟悉一个网络库&#xff0c;包括网络库的应用和其底层实现。我们熟知的网络库有 libevent、libev、muduo、Netty 等&#xff0c;其中 muduo 是由陈硕大佬个人开发的 TCP 网络库&#xff0c;最近跟着课程正在深…

分布式与一致性协议之ZAB协议(四)

ZAB协议 ZooKeeper是如何选举领导者的。 首先我们来看看ZooKeeper是如何实现成员身份的&#xff1f; 在ZooKeeper中&#xff0c;成员状态是在QuorumPeer.java中实现的&#xff0c;为枚举型变量 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING }其实&…

代码生成工具1 ——项目简介和基础开发

1 项目简介 需要提前在数据库建好表&#xff0c;然后执行代码生成工具&#xff0c;会生成简单的Java文件&#xff0c;避免重复编写增删改查代码。类似的工具网上有很多&#xff0c;本人开发这个工具属于自娱自乐。这个专栏会记录开发的过程。 2 项目搭建 数据库使用MySQL &…

js图片回显的方法

直接上代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body>// HTML部分<input type"file" id"fileInput"><button onclick"show…

深度学习技术之加宽前馈全连接神经网络

深度学习技术 加宽前馈全连接神经网络1. Functional API 搭建神经网络模型1.1 利用Functional API编写宽深神经网络模型进行手写数字识别1.1.1 导入需要的库1.1.2 加载虹膜&#xff08;Iris&#xff09;数据集1.1.3 分割训练集和测试集1.1.4 定义模型输入层1.1.5 添加隐藏层1.1…

栈结构(详解)

1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&am…

省级生活垃圾无害化处理率面板数据(2004-2022年)

01、数据简介 生活垃圾无害化处理率是指经过处理的生活垃圾中&#xff0c;达到无害化标准的垃圾所占的比例。这一指标是衡量城市垃圾处理水平的重要标准&#xff0c;反映了城市对垃圾进行有效管理和处理的能力。 生活垃圾无害化处理的主要方式包括生活垃圾焚烧、生活垃圾卫生…

react18【系列实用教程】moxb —— 集中状态管理 (2024最新版)

官方文档 https://www.mobxjs.com/ moxb 和 redux 都能用于 react 的状态管理&#xff0c;但 moxb 更简单&#xff0c;适合规模不大的应用 &#xff08;规模大的应用若合理组织代码结构&#xff0c;也能用 moxb&#xff09; 安装 moxb npm i mobx npm i mobx-react-lite此处安…

C语言洛谷题目分享(11)回文质数

目录 1.前言 2.题目&#xff1a;回文质数 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 3.小结 1.前言 哈喽大家好&#xff0c;今儿继续为大家分享一道蛮有价值的一道题&#xff0c;希望大家多多支持喔~ 2.题目&#xff1a;回文质数 1.题目描述 因为 151 …

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM&#xff1f; Oracle Certified Master (OCM)是Oracle认证大师&#xff0c;…

【51】Camunda8-Zeebe核心引擎-Zeebe Gateway

概述 Zeebe网关是Zeebe集群的一个组件,它可以被视为Zeebe集群的联系点,它允许Zeebe客户端与Zeebe集群内的Zeebe代理进行通信。有关Zeebe broker的更多信息,请访问我们的附加文档。 总而言之,Zeebe broker是Zeebe集群的主要部分,它完成所有繁重的工作,如处理、复制、导出…

软件工程期末复习(2)

软件工程 软件危机与软件工程的提出&#xff1a; 面对软件危机&#xff0c;1968年德国召开的一次NATO会议上首次签署声明“软件工程”这一说法&#xff0c;认为软件工程应当使用业已建立的工程学科的基本原理和范型。 背后驱使的观念是&#xff1a;软件设计、实现和维护应当与…

网络编程套接字详解

目录 1. 预备介绍 2.网络字节序 3.udp网络程序 4.地址转换函数 5.udp网络编程 1.预备介绍 1.1源IP地址和目标IP地址 举个例子: 从北京出发到上海旅游, 那么源IP地址就是北京, 目标IP地址就是上海. 1.2 端口号 作用: 标识一个进程, 告诉OS这个数据交给那个进程来处理; (1)…

Redis详解(二)

事务 什么是事务&#xff1f; 事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作&#xff1a;事务中的命令要么全部被执行&#xff0c;要么全部都…

JVM内存结构

文章目录 JVM的内存结构程序计数器虚拟机栈&#xff08;栈&#xff09;本地方法栈Native关键字 堆元空间&#xff08;JDK1.8之前为永久代&#xff09; 实例对象实例化的过程 JVM的内存结构 先看下图 内存结构分为以下的两种&#xff1a;线程私有以及线程共享 线程私有&#x…

1070: 邻接矩阵存储简单路径

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int n; int sta, des; vector<int> path; vector<vector<int>> res; void dfs(vector<int> &a,int i) {a[i] 1;path.push_back(i);…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

【Ubuntu永久授权串口设备读取权限“/dev/ttyUSB0”】

Ubuntu永久授权串口设备读取权限 1 问题描述2 解决方案2.1 查看ttyUSB0权限&#xff0c;拥有者是root&#xff0c;所属用户组为dialout2.2 查看dialout用户组成员&#xff0c;如图所示&#xff0c;普通用户y不在dialout组中2.3 将普通用户y加入dialout组中2.4 再次查看dialout用…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数&#xff08;ERror Function, ERF&#xff09;进行简单的介绍&#xff0c;并探索如…

Linux网站服务

1.概念:HTML:超级文本编辑语言 网页:使用HTML,PHP,JAVA语言格式书写的文件。 主页:网页中呈现用户的第一个界面。 网站:多个网页组合而成的一台网站服务器。 URL:统一资源定位符&#xff0c;访问网站的地址。 网站架构:LAMP: LinuxApacheMYSQLPHP(系统服务器程序数据管理…