【数据结构和算法】认识队列,并实现循环队列

news2024/12/23 1:11:16

上接前文,我们学习了栈的相关知识内容,接下来,来认识一个与栈类似的,另一种特殊的线性表,队列,本文目的是了解并认识队列这一概念,并实现循环队列

目录

一、认识队列

1.队列的概念

2.队列的实现

二、实现循环队列

1.结构体格式以及初始化

2.队尾插入元素(入队)

3.队头删除数据(出队)

4.打印

5.清空队列、返回队头元素、返回队列元素个数

三、完整代码实现

总结


一、认识队列

1.队列的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊的线性表,队列具有先进先出的特性,在队尾插入数据,称为入队,在队头删除数据,称为出队。

如图所示:

2.队列的实现

队列可以由两种方式来实现,分别可以由顺序表,和链表来实现,队列又分为循环队列,非循环队列。

区分:

1.非循环队列时,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会低一点。

2.循环队列的时候,使用数组更加方便简洁,唯一缺点就是循环队列用数组的时候,只能是静态的数组,动态不能构成循环队列,当然可以使用循环链表

二、实现循环队列

我们使用数组的结构来实现循环队列

1.结构体格式以及初始化

代码如下:

#define MAXSIZE 11//表示的是数组的元素个数,多一个1,是为了留给rear空间的
typedef struct SqQueue {
	int data[MAXSIZE];
	int front;//队头
	int rear;//队尾   front 和 rear 就是指针(类似)
}SqQueue;

//初始化队列
void InitQueue(SqQueue* ps) {
	//初始化队列只需要队头队尾都为0   表示下标起始位置
	ps->front = ps->rear = 0;
}

实际上,我们使用的是静态数组,也只有这样我们才能实现循环队列,如果是动态数组,就无法实现循环效果,而且定义的MAXSIZE大小为11,有一个空间是不被存放数值的,作为一个标志。

2.队尾插入元素(入队)

最重要的一点是理解 

(rear+1)%MAXSIZE==front            这是判断队列是否为满队列的标志

如图所示:

 代码如下:

//队尾插入元素
void EnQueue(SqQueue* ps,int data) {
	//插入的时候先进行判满
	if ((ps->rear + 1) % MAXSIZE == ps->front) {//最多存储MAXSIZE-1个元素
		//表示已经满了
		perror("队列已经满了,无法加入新元素\n");
		exit(-1);//stdlib.h  头文件里面的
	}
	ps->data[ps->rear] = data;
	ps->rear = (ps->rear + 1) % MAXSIZE;
}

3.队头删除数据(出队)

如图所示:

代码如下:

//队头出队
//只需要移动指针位置即可
void OutQueue(SqQueue* ps, int* data) {
	//出队先判别是否为空
	if (ps->rear == ps->front) {
		perror("为空队列,无法出队\n");
		exit(-1);
	}
	*data = ps->data[ps->front];
	ps->front = (ps->front + 1) % MAXSIZE;
	//不需要整体移动只要将队头指针后移就可以
}

4.打印

如图所示:

代码如下:

//遍历打印元素
void PrintQueue(SqQueue* ps) {
	int i = 0;
	printf("Queue->");
	while ((i + ps->front)%MAXSIZE != ps->rear) {
		//从front的队头位置开始,i从0开始 ++一直到等于rear结束
		printf("%d->", ps->data[i + ps->front]);
		i = (i + 1) % MAXSIZE;
	}
	printf("NULL\n");
}

5.清空队列、返回队头元素、返回队列元素个数

代码如下:

//将队列清空

void ClearQueue(SqQueue* ps) {
	ps->front = ps->rear = 0;
}

//返回队头元素
void GetHead(SqQueue* ps, int* data) {
	if (ps->front == ps->rear) {
		perror("为空队列\n");
		exit(-1);
	}
	*data = ps->data[ps->front];
}

//返回队列中的元素个数

int CountSqQueue(SqQueue* ps) {
	return (ps->rear - ps->front + MAXSIZE) % MAXSIZE;
}

三、完整代码实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include<stdlib.h>
//构建的是循环队列,是使用数组的形式,完成的循环队列

#define MAXSIZE 11//表示的是数组的元素个数,多一个1,是为了留给rear空间的
typedef struct SqQueue {
	int data[MAXSIZE];
	int front;//队头
	int rear;//队尾   front 和 rear 就是指针(类似)
}SqQueue;

//初始化队列
void InitQueue(SqQueue* ps) {
	//初始化队列只需要队头队尾都为0   表示下标起始位置
	ps->front = ps->rear = 0;
}

//将队列清空

void ClearQueue(SqQueue* ps) {
	ps->front = ps->rear = 0;
}

//队尾插入元素
void EnQueue(SqQueue* ps,int data) {
	//插入的时候先进行判满
	if ((ps->rear + 1) % MAXSIZE == ps->front) {//最多存储MAXSIZE-1个元素
		//表示已经满了
		perror("队列已经满了,无法加入新元素\n");
		exit(-1);//stdlib.h  头文件里面的
	}
	ps->data[ps->rear] = data;
	ps->rear = (ps->rear + 1) % MAXSIZE;
}

//队头出队
//只需要移动指针位置即可
void OutQueue(SqQueue* ps, int* data) {
	//出队先判别是否为空
	if (ps->rear == ps->front) {
		perror("为空队列,无法出队\n");
		exit(-1);
	}
	*data = ps->data[ps->front];
	ps->front = (ps->front + 1) % MAXSIZE;
	//不需要整体移动只要将队头指针后移就可以
}
//遍历打印元素
void PrintQueue(SqQueue* ps) {
	int i = 0;
	printf("Queue->");
	while ((i + ps->front)%MAXSIZE != ps->rear) {
		//从front的队头位置开始,i从0开始 ++一直到等于rear结束
		printf("%d->", ps->data[i + ps->front]);
		i = (i + 1) % MAXSIZE;
	}
	printf("NULL\n");
}
//返回队头元素
void GetHead(SqQueue* ps, int* data) {
	if (ps->front == ps->rear) {
		perror("为空队列\n");
		exit(-1);
	}
	*data = ps->data[ps->front];
}

//返回队列中的元素个数

int CountSqQueue(SqQueue* ps) {
	return (ps->rear - ps->front + MAXSIZE) % MAXSIZE;
}

int main() {
	SqQueue Q;
	InitQueue(&Q);
	EnQueue(&Q, 1);
	EnQueue(&Q, 2);
	EnQueue(&Q, 3);
	EnQueue(&Q, 4);
	EnQueue(&Q, 5);
	PrintQueue(&Q);
	int a = 0;
	OutQueue(&Q, &a);
	PrintQueue(&Q);
	EnQueue(&Q, 1);
	EnQueue(&Q, 2);
	//EnQueue(&Q, 3);
	EnQueue(&Q, 4);
	EnQueue(&Q, 4);
	EnQueue(&Q, 5);
	EnQueue(&Q, 5);
	PrintQueue(&Q);
}

总结

本文了解认识队列这一新的概念,我们也通过数组的结构实现循环队列,这一种方式实现循环队列是比较简单好理解的,主要的是理解MAXSIZE为什么要多一个空间,例如设置为11,还有判空,判满,操作。这是最为重要的。

判空:rear==front

判满:(rear+1)%MAXSIZE==front

得到队列元素个数:(rear-front+MAXSIZE)%MAXSIZE

front、rear、i得到下一个位置的方法:

例如:rear=(rear+1)%MAXSIZE

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

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

相关文章

入门力扣自学笔记232 C++ (题目编号:1669)

1669. 合并两个链表 题目&#xff1a; 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请…

Docker-harbor私有仓库部署与管理

目录 前言 一、Harbor概述 二、Harbor的特性 三、Harbor的构成 四、Harbor构建Docker私有仓库 环境配置 部署Harbor服务 物理机访问server IP 添加项目并填写项目名称 通过127.0.0.1来登陆和推送镜像 其他客户端上传镜像到Harbor 维护管理Harbor 创建Harbor用户 …

JavaWeb_JavaScript

一、简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#xff0c;不需要编译&#xff0c;由浏览器直接…

GPT-3是精神病患者吗?从心理学角度评估大型语言模型

原文链接&#xff1a;https://www.techbeat.net/article-info?id4494 作者&#xff1a;seven_ 20世纪60年代&#xff0c;麻省理工学院人工智能实验室的Joseph Weizenbaum编写了第一个自然语言处理&#xff08;NLP&#xff09;聊天机器人ELIZA[1]&#xff0c;ELIZA通过使用模式…

linux Redis 集群搭建

在单例模式下继续执行&#xff0c;新增文件夹将之前解压后的文件复制到新增的文件夹中修改配置文件&#xff0c;并放入bin中bind 10.88.99.251&#xff08;ip设置&#xff09;protected-mode yes&#xff08;默认yes&#xff0c;开启保护模式&#xff0c;限制为本地访问&#x…

ASEMI整流桥GBU808在选型的过程中需要注意几点

编辑-Z 型号&#xff1a;GBU808 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;800V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;560V 最大直流阻断电压&#xff08;VDC&#xff09;&#xff1a;800V 最大平均正向整流输出电流&#xf…

为2023年做好 IT 安全防御准备

随着网络安全威胁形势的不断演变&#xff0c;安全运营中心 (SOC) 团队在新年伊始花时间审查他们的战略和关键保护措施。 SOC 团队明白&#xff0c;有效的安全性永远不会是一劳永逸的项目。现有的工具和服务需要不断监控和更新&#xff0c;以确保它们能够抵御当前和新出现的威…

测试人员提高业务掌握度的方案

测试人员除了掌握测试相关技术&#xff0c;比如测试流程、测试用例编写思路、自动化脚本的编写、维护之外&#xff0c;还需要对自己所测试的具体业务进行学习和掌握。 只有这样&#xff0c;才能去涉及灰盒、白盒测试&#xff0c;在测试执行过程中&#xff0c;提高自己分析、定位…

17《Protein Actions Principles and Modeling》-《蛋白质作用原理和建模》中文分享

​结合亲和力具有自由能的分子基础理论&#xff1a;在本章中&#xff0c;我们使用K来衡量结合亲和力。我们可以通过结合曲线(binding curves,)来像这样定义一个结合作用力。这样的曲线能给出配体结合的数量与溶液中配体数量的关系。而结合亲和力K也存在关于分子结构以及能量基础…

zabbix6.0配置邮件告警

1、 配置发送邮件服务器&#xff08;管理媒介Email&#xff09; 2、 创建用户用来接收邮件告警&#xff08;管理用户创建用户&#xff09; 用户 报警媒介 权限 3、 设置触发器报警后的动作&#xff08;配置动作触发器动作创建动作&#xff09; 邮件报警是基…

【C++初阶】六、STL---string模拟实现

目录 一、模拟实现接口总览 二、string模拟实现 2.1 构造函数 2.2 析构函数 2.3 拷贝构造函数 2.3.1 传统写法 2.3.2 现代写法 2.4 赋值运算符重载 2.4.1 传统写法 2.4.2 现代写法 2.5 iterator 2.5.1 begin 2.6 Capacity 2.6.1 size 2.6.2 capacity 2.6.2 emp…

Maven的下载安装配置IDEA详细过程

1. 去官网下载好并且放在同一文件夹下面 下载maven安装包&#xff0c;解压即可使用 &#xff08;下载路径&#xff09;http://maven.apache.org/download.cgi 2. maven配置环境变量 MAVEN_HOME D:\IT\Java\apache-maven-3.8.4&#xff1a;这个写你自己放的目录下 进Path新增 %…

推荐系统之召回集读取服务

5.4 召回集读取服务 学习目标 目标 无应用 无 5.4.1 召回集读取服务 添加一个server的目录 会添加推荐中心&#xff0c;召回读取服务&#xff0c;模型排序服务&#xff0c;缓存服务这里先添加一个召回集的结果读取服务recall_service.pyutils.py中装有自己封装的hbase数据库读…

【GD32F427开发板试用】GD32的ISP进行程序烧录

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;羁傲不驯ぃ 什么是ISP? ISP是In-System Program的缩写&#xff0c;即在系统编程。通常我们开发使用仿真器来下载和调试程序&#xff0c;当固…

linux下安装elasticsearch

一&#xff1a;安装JDK1&#xff1a;java安装地址最新版&#xff1a;https://www.oracle.com/java/technologies/javase-downloads.html历史版&#xff1a;https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html2&#xff1a;安装java(1)&#xff1a;安…

vue使用echarts画可视化大屏

画出来的页面效果如下&#xff1a; 一、布局 整体使用element-ui的layout布局&#xff0c;即el-rowel-col&#xff0c;便于自适应 二、配置跨域 首先创建个vue.config.js的文件 module.exports {lintOnSave: false,devServer: {proxy: { //配置跨域/: {target: , //填写…

Python——matplotlib绘图可视化知识点整理

无论你工作在什么项目上&#xff0c;IPython都是值得推荐的。利用ipython --pylab&#xff0c;可以进入PyLab模式&#xff0c;已经导入了matplotlib库与相关软件包&#xff08;例如Numpy和Scipy)&#xff0c;额可以直接使用相关库的功能。 本文作为学习过程中对matplotlib一些…

Oracle Blogs上的Flashback文章

Oracle Database und Temporal Validity Temporal Validity和Flashback的区别&#xff1f;两者通常配合使用。 延伸阅读&#xff1a;Oracle 数据库和时间有效性 时间有效性也称为 Flashback Time Travel。 显示不可见的列&#xff1a; set colinvisible on desc <table_…

PyQt5开发环境搭建 1.3 Python语法练习

第一组练习1阅读理解。输入红色框框中命令。说出文中大致意思。&#xff08;限30个字&#xff09;解&#xff1a;点击运行之后会跳到一个网站https://xkcd.com/353/练习2建立如下py文件并运行&#xff0c;贴出在Eric6下运行输出结果&#xff08;注意文件名中的bkjtest用自己的姓…

NSSCTF Round#7部分wp

Web ec_RCE 源码: <!-- A EZ RCE IN REALWORLD _ FROM CHINA.TW --> <!-- By 探姬 --> <?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv(LANGzh_TW.utf8); $action $_POST["a…