2024-11-23 队列及顺序存储实现

2.3.1 队列及顺序存储实现

与堆栈类似,队列也是一种受限制的线性表。

其实我们在日常生活中经常会碰到排队。我们来观察一下,什么叫做队列,里面有两个最基本的操作,一个叫做入队,一个叫做出队。也就是你能加入这个队伍,还有人受到服务之后可以离开这个队伍。

我们观察就可以发现,加入队伍必须加入队尾,然后你接受服务从队头开始。

队列,我们称其为受操作约束的线性表。队列两个最主要的操作:插入和删除分别发生在队列的两头。一般的线性表可以在任何位置进行插入删除。

对比与堆栈,堆栈也是一个受限制的线性表,但是我们知道,堆栈的插入和删除只能在一端进行。队列是分别在两端。

数据插入,我们称之为入队。

数据删除,我们称之为出队。

由于它是从一端插入,从另一端删除,所以它表现出来的特点是先来先服务。所以这种表又被称为先进先出表。

队列的抽象数据类型描述

在这里插入图片描述

队列的顺序存储实现

队列的存储实现方式同样也有两种,一种是顺序存储,一种是链式存储。

顺序存储即由数组来表示,即用一个数组来存储队列的元素。由于队列由两头,我们在一头插入,在另一头删除。所以我们有两个变量来指示这两头。队列的头记作front, 队列的尾记作rear.

对比与堆栈,堆栈是一个数组加上一个top, 而队列是有两头发生,所以定义了一个front, 一个rear.
在这里插入图片描述

举一个例子

假定我们有一些工作需要处理,我们按照工作到来的先后顺序进行处理。所以,我们准备要处理的工作就形成了一个队列。

一开始的时候队列是空的。这个时候,frong, rear指向哪里呢?

我们可以都将他们设置为-1.
在这里插入图片描述

这个时候队列就是空的了。接下俩插入一个工作。这个时候,rear就指向了0.
在这里插入图片描述

再加一个工作,rear再往后挪动。。。
在这里插入图片描述

接下来删除一个工作,
在这里插入图片描述

front就指向了0.

所以,整个队列的操作就是:当插入一个元素,rear+1;当删除一个元素,front+1.

当达到下面这个状态时:
在这里插入图片描述

rear到了数组的最后,这个时候,如果想要加入一个元素,就无法加入了。而实际上队列的前头还是空的。 这个时候,需要想办法来解决这个问题。

我们很自然地就想到,后面的元素可以放到前面。 这就形成了我们后面称之为循环队列的思想:即将数组扳过来形成一个环。
在这里插入图片描述

从0的位置开始放,5放满了再回过头来放到0,这就形成了循环队列的组织结构。

一开始的时候,front和rear都指向某一个位置,front与rear相等的时候,队列是空的。因为按照我们前面的组织方法,rear指向的是队列实际的最后一个元素的位置,而front是第一个元素前一个。所以当front与rear相等时就意味着队列中是没有元素的。

当我们进行一系列操作到下面这个位置时候,
在这里插入图片描述

此时,如果再加入一个元素,rear+1之后就会和front相等。然而,rear与front相等代表队列是空的,而现在队列是满的。这就会产生一个问题:

当front与rear相等时,队列是空还是满?

队列可能是空的,也可能是满的。

为什么会出现空、满无法区分?根本原因是什么?

我们判断堆栈空满的根据是front与rear的相对距离。front与rear的取值范围是0到n-1. 本例子中,取值范围是0到5.

所以front与rear的差距有6种情况:0,1,2,3,4,5,而队列装在元素个数情况有7种:

0(空队列),1(一个元素),2,3,4,5,6

即如果数组的大小为n的话,front与rear的差距的情形则为n种,而队列的装载情况一共有n+1种。而想通过n种状态去区分n+1种状态是不可能的。就像我们用一个bit来区分三种情况是不可能的。解决的方案有两种:

(1)使用额外标记:Size或者tag域

Size记录队列中元素的个数,只要通过判断Size为n还是为0即可判断队列装载情况是空还是满的。

另外一种用一个0,1标记tag, 删除一个元素,将tag置0, 插入一个元素,将tag置1. 当front与rear相等导致无法区分是空还是满的时候,通过查看tag是为1还是为0,来判断最后一个操作是放入元素还是删除元素,进而判断队列是空还是满。

(2)仅使用n-1个数组空间

即数组不放满。例如在本例子中,当数组中放入了5个元素的时候,就不再放了,即认为队列已经满了。

具体来讲,第二种方案的具体实现方法如下:

入队列
在这里插入图片描述

rear+1如果与front碰上了,就认为是满的。但是我们的这个队列是循环队列,5的下一个位置就是0. 那么在程序上如何实现5的下一个为0呢:**求余函数。**5+1对6求余就是0.

出队列:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络学习记录

目录 神经网络基础定义: 基本组成部分 工作流程 卷积层(卷积定义)【CONV】: 卷积层(Convolutional Layer) 特征提取:卷积层的主要作用是通过卷积核(或滤波器)运算提…

数据结构初阶---复杂度

一、数据结构前言 1.数据结构与算法 数据结构(Data Structure):是计算机组织、存储数据的一种方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入&am…

二叉树的层次遍历

二叉树的层次遍历 题目 https://leetcode-cn.com/problems/binary-tree-level-order-traversal/ 描述 给你一个二叉树,请你返回其按 层次遍历 得到的节点值(即逐层地,从做到右访问所有节点) 代码实现 通过两个数组来交替打印 class Solution(object):def levelOrder

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…

【Linux系统】—— 基本指令(四)

【Linux系统】—— 基本指令(三) 1「find」指令2 「grep」指令2.1 初识「grep」指令2.2 「grep」指令 选项 3 打包压缩基本知识4 「zip / unzip」指令5「tar」命令6 文件互传6.1 Linux 与 Windows 互传6.1.1 Linux向Windows传输6.1.2 Windows向Linux传输…

将django+vue项目发布部署到服务器

1.部署django后端服务 部署架构 1.1 下载依赖插件 pip3.8 freeze > requirements.txt1.2 安装依赖插件 pip3 install -r requirements.txt1.3 安装mysql数据库 apt install mysql-server初始化数据库 CREATE USER admin% IDENTIFIED WITH mysql_native_password BY 123…

网络层协议IP

对于网络层我们直接通过IP协议来了解其内容 一.IP协议 首先我们先来了解几个概念: 主机:配有IP地址,但是不进行路由控制的设备 路由器:配有IP地址,同时进行路由控制的设备 节点:主机和路由器的统称 所以现在…

AIGC-----AIGC在虚拟现实中的应用前景

AIGC在虚拟现实中的应用前景 引言 随着人工智能生成内容(AIGC)的快速发展,虚拟现实(VR)技术的应用也迎来了新的契机。AIGC与VR的结合为创造沉浸式体验带来了全新的可能性,这种组合不仅极大地降低了VR内容的…

如何利用 Puppeteer 的 Evaluate 函数操作网页数据

介绍 在现代的爬虫技术中,Puppeteer 因其强大的功能和灵活性而备受青睐。Puppeteer 是一个用于控制 Chromium 或 Chrome 浏览器的 Node.js 库,提供了丰富的 API 接口,能够帮助开发者高效地处理动态网页数据。本文将重点讲解 Puppeteer 的 ev…

【运维】 使用 shell 脚本实现类似 jumpserver 效果实现远程登录linux 服务器

实现效果 通过序号选择登录: 配置证书登录 配置证书登录可以免去每次都输入密码的麻烦。详见另一篇博文: 【ssh】使用秘钥对(公钥/私钥)登录linux主机以及原理介绍 自动登录脚本 直接复用以下脚本即可,在 server…

sqlmap学习,打靶sqli-labs.(1-19)

前言:用于学习sqlmap的简单使用,使用sqli-labs靶场进行测试。 当然,在实战中,考虑的更多,例如如何隐藏自己(特征码),编码加解密、sqlmap抓包调试分析等... 不过那些都是后话,太遥远...基础NO.1!! 先贴上我…

A045-基于spring boot的个人博客系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

[RabbitMQ] 保证消息可靠性的三大机制------消息确认,持久化,发送方确认

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…

Unity中动态生成贴图并保存成png图片实现

实现原理&#xff1a; 要生成长x宽y的贴图&#xff0c;就是生成x*y个像素填充到贴图中&#xff0c;如下图&#xff1a; 如果要改变局部颜色&#xff0c;就是从x1到x2(x1<x2),y1到y2(y1<y2)这个范围做处理&#xff0c; 或者要想做圆形就是计算距某个点&#xff08;x1,y1&…

sklearn学习

介绍&#xff1a;scaler&#xff1a;换算的意思 1. 归一化MinMaxScaler() 归一化的意思是将一堆数&#xff0c;如果比较离散&#xff0c;为了让数据更适合模型训练&#xff0c;将离散的数据压缩到0到1之间&#xff0c;以方便模型更高效优质的学习&#xff0c;而对数据的预处理…

windows下安装wsl的ubuntu,同时配置深度学习环境

写在前面&#xff0c;本次文章只是个人学习记录&#xff0c;不具备教程的作用。个别信息是网上的&#xff0c;我会标注&#xff0c;个人是gpt生成的 安装wsl 直接看这个就行&#xff1b;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…

Flutter:启动屏逻辑处理02:启动页

启动屏启动之后&#xff0c;制作一个启动页面 新建splash&#xff1a;view 视图中只有一张图片sliding.png就是我们的启动图 import package:flutter/material.dart; import package:get/get.dart; import index.dart; class SplashPage extends GetView<SplashController…

【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;准确引导ChatGPT创建爆款小红书文案GPTs指令案例&#x1f4af; 高效开发GPTs应用的核心原则明确应用场景和目标受众构建多样化风格模板提问与引…

【通俗理解】隐变量的变分分布探索——从公式到应用

【通俗理解】隐变量的变分分布探索——从公式到应用 关键词提炼 #隐变量 #变分分布 #概率模型 #公式推导 #期望最大化 #机器学习 #变分贝叶斯 #隐马尔可夫模型 第一节&#xff1a;隐变量的变分分布的类比与核心概念【尽可能通俗】 隐变量的变分分布就像是一场“捉迷藏”游戏…

云计算-华为HCIA-学习笔记

笔者今年7月底考取了华为云计算方向的HCIE认证&#xff0c;回顾从IA到IE的学习和项目实战&#xff0c;想整合和分享自己的学习历程&#xff0c;欢迎志同道合的朋友们一起讨论&#xff01; 第三章&#xff1a;常见设备 交换机 二层交换机和三层交换机&#xff0c;所谓二层交换机…