C语言数据结构-队列的知识总结归纳

news2024/11/26 12:37:49

队列的知识总结归纳

    • 一.队列的基本概念
    • 二.循环队列的顺序存储常见的基本操作以及详细图解
      • 1.队列的顺序存储结构类型定义
      • 2.初始化队列
        • 初始化队列示意图
      • 3.判断队空
      • 4.判断队列是否满的三种方法
        • 图示
      • 5.入队或进队
        • 入队的示意图
      • 6出队或退队
        • 出队的图示
    • 三. 队列的链式存储结构
    • 四. 链式队列的基本操作
      • 1.队列链式存储类型描述
      • 2.初始化链式队列
      • 3.链式队列判断队列是否为空
      • 4.链式队列入队操作
      • 5.链式队列的出队操作
    • 五. 双端队列
    • 六.总结

一.队列的基本概念

队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除,向队列中插入元素叫做入队,进队,向队列中删除元素叫做出队或离队.这和我们日常排队打饭是一样的,都遵循一个先进先出的特性

二.循环队列的顺序存储常见的基本操作以及详细图解

1.队列的顺序存储结构类型定义

#define _CRT_SECURE_NO_WARNINGS 1

#define MAX_SIZE 100
#define Elemtype int

typedef struct QNode
{
	Elemtype data[MAX_SIZE];
	int front;//队头指针
	int rear;//队尾指针
}SqQueue;

2.初始化队列

void InitQueue(SqQueue* SQ)
{
	SQ->front = SQ->rear = 0;
}

初始化队列示意图

在这里插入图片描述

3.判断队空

bool QueueEmpty(SqQueue* SQ)
{
	if (SQ->front == SQ->rear)//队空
	{
		return true;
	}
	return false;
}

他就是根据上面的初始化状态进行队列的判空操作,从上面图示显然可以知道,当front和rear都等于0的时候为空队列

4.判断队列是否满的三种方法

在这里插入图片描述

方法一:

通过浪费一个存储空间来区别队满队空的状态

图示

在这里插入图片描述

bool QueueFull(SqQueue* SQ)
{
	if ((SQ->rear + 1) % MAX_SIZE == SQ->front)
	{
		return true;
	}
	return false;
}

方法二:
在定义队列的存储类型的时候,创建一个length的变量,每次插入元素让length++,每次删除元素让length–,知道length == MAX_SIZE的时候来得出队列是否为满队状态

方法三:
在定义队列的存储类型时,只需要定义一个变量flag,入队操作flag =1,出队操作,flag = 0;让其区分在front==rear的时候,此时的flag状态是1的话就说明队满了

5.入队或进队

在入队的时候我们首先要判断队列是否满的情况,以免出现内存上溢,后面使用rear = (rear+1)%MAX_SIZE是为了尽可能不浪费内存空间,让进行出队后空出来的空间能够二次使用,使得整个队列呈一个环状的空间也可将其称为循环队列
bool PushQueue(SqQueue* SQ,int x)
{
if ((SQ->rear + 1) % MAX_SIZE == SQ->front)
{
return true;//队满
}
SQ->data[SQ->rear] = x;
SQ->rear = (SQ->rear + 1) % MAX_SIZE;
return false;
}

入队的示意图

在这里插入图片描述

6出队或退队

在出队的时候,我们首先需要判断队列是否为空队列,其次,为了能够充分利用开辟的空间,我们的front指针要以环状的遍历方式让元素出队
代码实现

bool PopQueue(SqQueue* SQ, int* x)
{
	if (SQ->front == SQ->rear)
	{
		return false;
	}
	*x = SQ->data[SQ->front];
	SQ->front = (SQ->front + 1) % MAX_SIZE;//使得头指针对一个环状的队列进行出队操作
	return true;
}

出队的图示

在这里插入图片描述

三. 队列的链式存储结构

队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表,头指针指向队头结点,尾指针指向队尾结点,即单链表的最后一个结点
在这里插入图片描述

四. 链式队列的基本操作

1.队列链式存储类型描述

#define _CRT_SECURE_NO_WARNINGS 1
typedef struct LinkNode
{
	struct LinkNode* next;
	int data;
}LNode;
typedef struct
{
	LNode* front;//队头指针
	LNode* rear;//队尾指针
}*LinkQueue;

2.初始化链式队列

建立头结点,让front 和 rear 指针都指向头结点

void InitQueue(LinkQueue& LQ)
{
	LQ->front = LQ->rear = (LNode*)malloc(sizeof(LNode));//建立头结点
	LQ->front = NULL;//初始化为空
}

3.链式队列判断队列是否为空

图解
在这里插入图片描述
只需要判断队头和队尾指针是否指向的是否为同一结点

bool IsEmpty(LinkQueue& LQ)
{
	if (LQ->front == LQ->rear)
	{
		return true;//队空
	}
	else
		return false;//非空
}

4.链式队列入队操作

链式队列与前面的队列顺序存储结构有所不同,顺序存储结构的队列在入队时需要进行队满的一个判断,而在链式存储结构中基本不存在空间不够用的情况,因为我们可以根据自己的需求进行空间的开辟,但队列的特性是不变的,依旧是遵循先进先出。
图示
在这里插入图片描述
**注意:**在入队第一个元素时,需要让我们的front指针指向链表的第一个带元素结点,但是如果我们初始化的时候不创建头结点的话,就不需要特殊处理第一个元素的入队操作,而不创建头结点,判断队空就是在初始化队列的时候让front和rear赋值为空指针,就当队头队尾指针都等于NULL的时候队列为空队

void PushQueue(LinkQueue& LQ,int input)
{
	LNode* s = (LNode*)malloc(sizeof(LNode));//创建新节点插入到队列中
	s->data = input;
	if (LQ->front == LQ->rear)
	{
		LQ->front = s;
	}
	LQ->rear->next = s;
	s->next = NULL;
	LQ->rear = s;
	
}

5.链式队列的出队操作

图示:
在这里插入图片描述
删除结点为队尾结点
在这里插入图片描述

代码实现

bool PopQueue(LinkQueue& LQ, int* output)
{
	if (LQ->front == LQ->rear)
	{
		return false;//队空
	}
	LNode* p = LQ->front->next;
	*output = p->data;
	LQ->front->next = p->next;//让结点p出队
	if (p == LQ->rear)//p为队列的队尾,删除之后让rear指针继续跟front指向同一结点使得达到空队的效果
	{
		LQ->rear = LQ->front;
	}
	free(p);//释放结点p,防止内存泄露
}

五. 双端队列

双端队列是指允许两端进行入队出队操作的队列其元素逻辑结构仍是线性结构
在这里插入图片描述
除了以上这种双端队列还有变种的受限的双端队列
一.一端可以进行插入删除,而另一端只能进行插入
在这里插入图片描述
二.一端可进行插入删除,另一端仅可以删除
在这里插入图片描述

限制双端队列和上面的队列使用只需要考虑受限的情况就好了,只需要了解队列出队和进队的操作的不同,入队和退队的受限不同肯定也会对元素的出队入队的顺序也会有其他方式

六.总结

队列是一种先进先出(FIFO)的数据结构,它的主要操作包括入队(enqueue)和出队(dequeue)。队列通常用于存储需要按顺序处理的元素,例如打印机任务、消息队列等。
队列可以通过数组或链表实现。使用数组实现的队列通常需要考虑队列满的情况,可以用循环队列解决。使用链表实现的队列则不需要考虑队列满的情况,但需要注意空队列的情况。
队列的时间复杂度为O(1)。入队和出队都只需要对队首或队尾进行操作,因此时间复杂度为常数级别。但需要注意的是,数组实现的队列在出队时需要移动元素,因此最坏情况下时间复杂度可能为O(n)。
队列还有一些常见的变种,例如双端队列(deque)、优先队列(priority queue),要注意他们的进队和退队的方式,它们都是在队列的基础上进行了扩展和优化。

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

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

相关文章

AutoGPT自主人工智能用法和使用案例

介绍 AutoGPT是什么:自主人工智能,不需要人为的干预,自己完成思考和决策【比如最近比较热门的用AutoGPT创业,做项目–>就是比较消耗token】 AI 自己上网、自己使用第三方工具、自己思考、自己操作你的电脑【就是操作你的电脑…

缺省函数,函数重载,引用简单介绍的补充说明

TIPS 命名空间域的作用实际上相当于把部分变量的名称给他隔离起来,这样的话就可以减少变量名的冲突。命名空间是对全局域当中的这些变量啊,函数啊,类型啊进行一个封装与隔离,可以防止你和我之间的冲突,也可以防止与库…

leetcode:各位相加(数学办法详解)

前言:内容包括:题目,代码实现,大致思路 目录 题目: 代码实现: 大致思路: 题目: 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回…

【云原生Docker】11-Docker镜像仓库

【云原生|Docker】11-Docker Registry(官方仓库) 文章目录【云原生|Docker】11-Docker Registry(官方仓库)前言docker registry简介操作示例hyper/docker-registry-web前言 ​ 前面我们所有的docker操作,使用的镜像都是在docker官方的镜像仓库下载,当然这…

总结825

学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 今日复习: 手绘高数第11讲思维导图,回顾线性代数第一讲 学习内容: 第12讲二重积分视频,纠正11讲…

手势控制的机器人手臂

将向你展示如何构建机械手臂并使用手势和计算机视觉来控制它。下面有一个在开发阶段的机械手臂的演示视频。展示开发中的手臂的演示视频:https://youtu.be/KwiwetZGv0s如图所示,该过程首先用摄像头捕捉我的手及其标志。通过跟踪特定的界标,例…

300到400的蓝牙耳机有哪些推荐?2023年值得入手的性价比蓝牙耳机

今年依旧是真无线蓝牙耳机快速发展的一年,市面上都有着各式各样的蓝牙耳机,一时间难以辨认哪些款式更适合自己,今天给大家介绍的是300元左右的蓝牙耳机,那这个价位的耳机到底怎么样呢?其实,300左右的蓝牙耳…

Qt 窗口置顶

文章目录一、前言二、示例代码三、补充说明四、窗口透明五、参考一、前言 我们使用QT进行界面开发时,可能会遇到需要将窗口置顶的情况。最常见的就是,需要制作一个悬浮工具栏,悬浮菜单,甚至是悬浮的画板。这就意味这我们需要将这个…

Javascript40行代码实现基础MVC原理。

参考文章 M数据层 V视图 C控制器 先来一个dom结构&#xff0c;一个p标签&#xff0c;用来展示输入的内容&#xff0c;一个input标签&#xff0c;用来输入内容⬇️ <p id"mvcp"></p> <input id"mvc"></input>创建Model类&#x…

第二部分——长难句——第一章——并列句

conjunction(and,but,if,when(while)) 想把两个句子&#xff08;多件事&#xff09;连在一块&#xff0c;就必须加上连词。 所以长难句到底是啥&#xff1f; 所以长难句&#xff08;直白表达&#xff0c;并不是语法表述&#xff09;就是几个简单句多家上几个连接词就齐活了&am…

一文读懂Profibus/Profinet/Ethernet的区别

Ethernet(以太网络)是大家很熟悉的一种网络了&#xff0c;由Xerox公司创建并由Xerox、Intel和DEC公司联合开发的基带局域网规范&#xff0c;是当今现有局域网采用的最通用的通信协议标准&#xff0c;包括标准的以太网&#xff08;10Mbit/s)、快速以太网&#xff08;100Mbit/s&a…

Python 自动化测试框架环境怎么搭建?这篇文章给你讲的明明白白

目录 Python 自动化测试框架环境搭建 第一步&#xff1a;安装 Python 第二步&#xff1a;安装 PyCharm 第三步&#xff1a;安装 Selenium WebDriver 第四步&#xff1a;安装浏览器驱动 第五步&#xff1a;创建测试用例 第六步&#xff1a;集成持续集成平台 总结 Python …

人工智能中的顶级期刊

本文描述了获取人工智能顶级期刊列表的方法&#xff0c;方便读者通过阅读顶级期刊中的论文跟踪人工智能前沿。同时&#xff0c;本文还介绍了获取人工智能顶级期刊投稿信息的方法&#xff0c;帮助读者提高论文的录用率。 1. 顶级期刊列表的获取方法 要查找某个领域的顶级期刊有…

RocketMQ 消费者Rebalance 解析——图解、源码级解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年4月15日 &#x…

gRPC 四种RPC类型异同

gRPC定义了如下四种RPC&#xff0c;刚开始接触的时候&#xff0c;感觉挺奇怪的&#xff0c;RPC不就是接口调用吗&#xff0c;区分这么多干啥&#xff1f;难道实现原理不一样&#xff1f;未读源码之前&#xff0c;还想着有啥神秘的地方&#xff0c;看完源码之后&#xff0c;才发…

Guns社区医疗项目

又是一年毕业季&#xff0c;计算机专业大四的同学们要接受毕业设计的考验啦。又有多少同学为了毕业设计而愁眉苦脸&#xff0c;心力憔悴。考虑到这些&#xff0c;这里为同学们分享一个适合你们毕业设计的作品以及详细介绍&#xff0c;让正在焦头烂额的同学们有所启发&#xff0…

MPC的560x系列的运行模式的介绍

一、模式简介 1、运行模式 一共11种模式&#xff0c;分别为RESET、DRUN、SAFE、TEST、RUN0、RUN1、RUN2、RUN3、HALT、STOP、STANDBY。其中RESET、DRUN、SAFE、TEST是系统工作模式&#xff0c;用户不用个特别关系&#xff0c;而后面几种是用于经常使用到的工作模式。 RESET&a…

ASP.NET Core - 依赖注入(二)

2&#xff0c;NET Core 依赖注入的基本用法 话接上篇&#xff0c;这一章介绍 .NET Core 框架自带的轻量级 Ioc 容器下服务使用的一些知识点&#xff0c;大家可以先看看上一篇文章 [ASP.NET Core - 依赖注入(一)] 2.3 服务解析 通过 IServiceCollection 注册了服务之后&#xf…

五一假期将近,给景区视频监控方案提几点建议

一、行业背景 随着旅游业的不断发展&#xff0c;旅游安全问题越来越受到重视。尤其是五一假期将近&#xff0c;为确保游客在景区内的人身安全和财产安全&#xff0c;景区必须采用高效、可靠的安防视频监控系统&#xff0c;并进行科学规划和设计&#xff0c;从而实现及时发现安…

Simulink simscape绳索和滑轮的使用总结

在做仿真的时候使用了绳索和滑轮&#xff0c;网上的资料不是很多&#xff0c;所以想想还是自己做一下记录&#xff0c;提供了一个小案例&#xff0c;文件上传到我的资源里了。 1.滑轮约束 Pulley 这个模块可以建立滑轮和绳索之间的约束。这个约束保证了绳子和滑轮之间 The pull…