数据结构--循环队列

1.队列的定义:

和栈相反,队列(queue)是一种先进先出(first in  first out,缩写为FIFO)的线性表.它只允许在表的一端进行插入,而在另一端删除元素.
在队列中,允许插入的一端叫做队尾(rear),允许删除的一端则称为队头(front).

2.循环队列的设计图示:

image-20230615214707595.png


3.循环队列的结构设计:

typedef  struct  SqQueue
{int *base;//指向动态内存;int front;//队头指针,队头元素的下标int rear;//队尾指针,当前可以插入数据的下标(队尾后一个元素的下标)//int queuesize;//队列的总容量,要做到自动扩容就必须增加这个成员;
}SqQueue,*PSqQueue;

4.循环队列的实现

//初始化
static  bool IsFull(PSqQueue pq)
{return  (pq->rear + 1) % SIZE == pq->front;//return pq->rear + 1 == pq->front;//error,需要处理成环形;
}//往队列中入数据(入队操作)
bool  Push(PSqQueue pq, int val)
{assert(pq != NULL);if (pq == NULL)return false;if (IsFull(pq))//如果队满则入队失败{return false;}pq->base[pq->rear] = val;//pq->rear++;//error,必须要处理成环形;pq->rear = (pq->rear + 1) % SIZE;return true;
}
//获取队头元素的值,但是不删除
bool  GetTop(PSqQueue pq, int* rtval)
{assert(pq != NULL);if (pq == NULL)return false;if (IsEmpty(pq)){return false;}*rtval = pq->base[pq->front];return true;
}
//获取队头元素的值,但是删除
bool   Pop(PSqQueue pq, int* rtval)
{assert(pq != NULL);if (pq == NULL)return false;if (IsEmpty(pq)){return false;}*rtval = pq->base[pq->front];//pq->front++;//errorpq->front = (pq->front + 1) % SIZE;return true;
}
//判空
bool IsEmpty(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return false;return  pq->front == pq->rear;
}
//获取队列中有效元素的个数
//重点,考点:公式
int  GetLength(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return -1;return (pq->rear - pq->front + SIZE) % SIZE;
}
//清空所有的数据
void Clear(PSqQueue pq)
{pq->front = 0;pq->rear = 0;
}
//销毁
void Destroy(PSqQueue pq)
{assert(pq != NULL);if (pq == NULL)return;free(pq->base);pq->base = NULL;pq->front = 0;pq->rear = 0;
}

5.循环队列的总结

1)队列:先进先出的一种线性结构,入队(插入)的一端称为队尾,出队(删除)的一端称为队头

2)队列的存储方式有两种,一种为顺序结构(顺序队列),两一种为链式结构(链式队列)
3)顺序队列一定会设计成环形队列,原因是线性队列的入队为O(1),出队为O(n),而环形队列的入队为O(1),出队为O(1)

4)浪费一个空间不使用,主要是为了区分队空和队满的情况:空是队头和队尾相同,满是rear(队尾指针)再往后走一步为front(队头指针) (浪费一个空间)
5)队满的处理方式:1.固定长度,队满则入队失败(处理简单,不实用),采用1,和书本一致.2,长度不固定,队满则自动扩容(实现稍微复杂)

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

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

相关文章

OpenHarmony实例应用:【常用组件和容器低代码】

介绍 本篇Codelab是基于ArkTS语言的低代码开发方式实现的一个简单实例。具体实现功能如下: 创建一个低代码工程。通过拖拽的方式实现任务列表和任务信息界面的界面布局。在UI编辑界面实现数据动态渲染和事件的绑定。 最终实现效果如下: 相关概念 低代…

Normalization

Norm介绍 归一化层,目前主要有这几个方法,Batch Normalization(2015年)、Layer Normalization(2016年)、Instance Normalization(2017年)、Group Normalization(2018年&…

11 Php学习:函数

PHP 内建函数Array 函数 PHP Array 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。 创建 PHP 函数 当您需要在 PHP 中封装一段可重复使用的代码块时,可以使用函数。下面详细解释如何创建 PHP 函数并举例说明。 创建 PHP 函数的语法 PHP 函数的基…

数字化时代:IT界的致富秘籍 —— 策略×态度×机遇

🌟 数字化时代:IT界的致富秘籍🚀 —— 策略态度机遇 在数字化浪潮中冲浪🏄‍♂️,IT行业犹如一片无限可能的蓝海。想要在这片汹涌的海洋中捕获财富,不是一件轻而易举的事。让我们一起深入探索,如…

商标没有去注册有哪些不好的影响!

有些商家咨询普推知产老杨,商标没有去注册有哪些不好的影响,其实对企业来说还有许多实际不利的影响,有时代价比注册一个商标要大很多。 想的商标名称没去注册商标,如果别人抢注拿下商标注册证,那就会涉及侵权&#xf…

Cascader 级联选择器 - 选择器最后一级数据为空

原因:将扁平数据转化为树形数据时,给每个项都添加了 children export const transList2Tree (list, rootPid) > {const result []list.forEach(item > {if (item.pid rootPid) {const children transList2Tree(list, item.id)item.children …

Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云

一、前言 记录时间 [2024-4-13] 系列文章简摘: Docker 学习笔记(六):挑战容器数据卷技术一文通,实战多个 MySQL 数据同步,能懂会用,初学必备 Docker 学习笔记(七)&#x…

暴雨孙辉:做好服务器,但更要辟出技术落地之道

稳扎稳打一直是暴雨的风格,这在被访者孙辉的身上尽显。作为暴雨(武汉暴雨信息发展有限公司)中国区销售及市场副总裁,在谈及公司的技术发展与市场推广走势之时,孙辉沉稳、敏锐且逻辑清晰。 因在服务器领域起步很早&…

mysql中的DML、DQL、DCL常用命令

文章目录 DML语句1.添加数据(INSERT)2.修改数据(UPDATA)3.删除数据(DELETE) DQL语句1.基础查询2.条件查询3.聚合函数4.分组查询5.排序查询6.分页查询 DCL语句1.管理用户2.权限控制 DML语句 1.添加数据(INSERT) 1.给指定字段添加数据:INSERT INTO 表名(字段1,字段2…

C# Solidworks二次开发:控制鼠标移动相关API详解

大家好,今天要介绍的是关于如何solidworks中用程序API来控制鼠标移动和滚轮缩放的功能。 下面是相关API: (1)第一个为Move,这个API的含义为在窗口空间中移动鼠标指针,下面是官方的具体解释: 其…

【linux】网络 - 传输层 -- socket(TCP/UDP)

文章目录 socket预备知识TCP和UDP 协议网络字节序 socket接口及辅助接口sockaddrudpserver和udpclient初始化udp服务器运行udp服务器udp客户端 tcpserver和tcpclient初始化服务器运行服务器Tcp客户端 守护进程 socket Socket(套接字)是计算机网络编程中…