循环队列的队空队满情况

有题目:

循环队列放在一维数组A[0....M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是  ( B )。
A.队空: end1 == end2;队满: end1 == (end2+1)mod M
B.队空: end1 == end2;队满: end2 == (end1+1)mod(M-1)
C.队空:end2 ==(end1+1)mod M;队满:end1==(end2+1)mod M
D.队空: end1==(end2+1)mod M;队满: end2 ==(end1+1)mod(M-1)

首先,什么是循环队列?

        1、存储在首尾循环相接的向量空间中的队列即为循环队列。

循环队列的队空和队满情况

        2、假设M为MaxSize最大容量,end1为头指针,指向队头元素;end2为尾指针,指向队尾元素的后一个位置                

                当循环队列为空时,end1==end2;当循环队列为满时,end1==end2;

                为了区别这两种情况,规定:

                ①  循环队列最多只能有 M-1 个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。

                ②  初始值为空。

                因此往往有两个结论:

                        循环队列判空的条件是end1==end2

                        循环队列判满的条件是end1==(end2+1)%M

                那么这两个结论是怎么来的呢?

                根据上面讲到的

                        因为循环队列最多只能有 M-1 个队列元素→故 M-1 那个点就是队尾元素

                        又因为end2为尾指针→故end2就是对应M-1 那个点

                        因为end1为头指针,又因为初始值为空,所以end1那个点记为null

                那么我们先根据这里讲的画出下面这张图:

                因为end1指向队头元素,故我们假设队头元素为0(看下图)

                又因为end2指向队尾元素的后一个位置,即end2+1,那么我们认为它移动了1个距离,由这个移动1个距离我们推出下面的就是M,也就是从左边 M-1 那移动了一个距离到这边 ,因此end2+1所在的点就是M所在的点

                所以根据下图的红色部分,因为我们上面的①说了:循环队列最多只能有 M-1 个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。

                M与M-1之间刚好空出一个存储单元,故0到M-1这部分就已经属于队满的状态,而每一段的完整部分是0到M,本段的M就是下一段的0,这个先不理解,你看到本文最后就知道,其实本段的end2到下一段的end1更容易理解。

所以回到题目:

循环队列放在一维数组A[0....M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。下列判断队空和队满的条件中,正确的是  ( B )。
A.队空: end1 == end2;队满: end1 == (end2+1) mod M
B.队空: end1 == end2;队满: end2 == (end1+1) mod (M-1)
C.队空:end2 ==(end1+1)mod M;队满:end1==(end2+1) mod M
D.队空: end1==(end2+1)mod M;队满: end2 ==(end1+1) mod(M-1)

=====================================================================

队空的情况我们很容易理解:

        因为队空,所以end2==null;又因为循环队列是处于循环相接的环形向量之中,故end2即end1,故end1==end2,都是null

=====================================================================  队满的情况:

      首先,我们要了解为什么循环队列要取模,即mod?

                为了防止指针溢出,使指针的读写不超出队列的范围。

      根据上面推导的图(即下图):

                简单一点,根据箭头来判断就行:

                        0是仅仅接受end1即头指针来指向它,即end1会自然帮我们找到0;

                        end2+1仅仅接受end2即尾指针来指向它,即end2会自然帮我们找到end2+1

                        由前面我们已得到end1 == end2,因为向量空间要形成一个相接的环形,故肯定本段的end2就是下一段的end1,但这中间有一个隐藏的关于地址衔接的过程,这个隐藏过程里本来是end2去加1   即变成   end2+1  简简单单就可以找到下一段的头指针end1的地址了,从而end1会自然帮我们找到0,这是我们理所当然地想,但这样做的结果会造成指针溢出,造成错误,而取模就是防止指针溢出,所以在这个隐藏过程中我们修改一下,改让end2+1先去取模M后得出结果即end1的地址,此时算出来的end1的地址才是正确的地址,这样就不会指针溢出了,而且end1还能帮我们去指向0即队头元素。

                 

                        也就是说,  (end2+1) mod M结果才是end1的正确地址,即:

                                                end1==(end2+1) mod M          

这就是循环队列中

从本段end2到下一段的end1之间

隐藏的

关于地址衔接时寻找end1正确地址的过程

内容

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

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

相关文章

用可视化案例讲Rust编程1. 怎么能学会Rust

用可视化案例讲Rust编程 1. 怎么能学会Rust 如果要列举Rust的优势,恐怕写个十条八条是写不完的,而且不管写哪条优势,都有很多同学跳起来反驳,比如我们说Rust比C/C内存安全,肯定有同学说C 20也支持内存安全&#xff0…

Java数组:一维数组、二维数组、Arrays

文章目录 1、一维数组1.1 数组概念1.2 数组的声明1.3 数组的静态初始化1.4 数组的动态初始化1.5 地址值1.6 数组元素访问1.7 索引1.8 数组的遍历1.9 数组两种初始化方式的区别 2、二维数组2.1 二维数组的声明2.2 二维数组的静态初始化2.3 二维数组的动态初始化2.4 二维数组的遍…

LCD—液晶显示

本节主要介绍以下内容 显示器简介 液晶控制原理 秉火3.2寸液晶屏简介 使用FSMC模拟8080时序 NOR FLASH时序结构体 FSMC初始化结构体 一、显示器简介 显示器属于计算机的I/O设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。…

计算机毕业设计 基于Javaweb的城乡居民基本医疗信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

【Linux Shell】2. Shell 变量

文章目录 【 1. 变量命名规则 】【 2. 变量的使用 】【 3. 只读变量 】【 4. 删除变量 】【 5. 变量类型 】【 6. Shell 字符串 】6.1 字符串分类6.2 字符串操作 【 7. Shell 注释 】7.1 单行注释7.2 多行注释 【 1. 变量命名规则 】 定义变量时,变量名不加美元符号…

Linux系统使用超详细(八)~磁盘管理

目录 一、认识磁盘 二、磁盘运行机制 三、磁盘检查 3.1查找设备名称和分区号 3.1.1使用lsblk命令: 3.1.2使用fdisk命令: 3.1.3使用blkid命令: 3.2检查方向 3.2.1文件系统完整性: 3.2.2磁盘健康状态: 3.2.3磁…

2024-python画图永久解决 matplotlib 中文乱码

2024-python画图永久解决 matplotlib 中文乱码 不多说了吧,大家肯定是自己安装了python,这些环境了,毕竟都知道乱码了,所有此处省略1万字,如果这些前期不会的,就不要来找我了,自己解决&#xf…

均匀与准均匀 B样条算法

B 样条曲线的定义 p ( t ) ∑ i 0 n P i F i , k ( t ) p(t) \sum_{i0}{n} P_i F_{i, k}(t) p(t)i0∑​nPi​Fi,k​(t) 方程中 n 1 n1 n1 个控制点, P i P_i Pi​, i 0 , 1 , ⋯ n i0, 1, \cdots n i0,1,⋯n 要用到 n 1 n1 n1 个 k k k 次 B 样条基函数 …

DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选

参考: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/107649770 https://github.com/kexinhuang12345/DeepPurpose ##安装 pip install DeepPurpose rdkitDeepPurpose包括: 数据: 关联TDC库下载,是同一作者开发的 https://blog.csdn.net/weixin_42357472/artic…

认识Git

🌎初识Git 初识Git 什么是Git Git的安装       Centos平台安装Git       Ubuntu平台安装Git Git的基本操作       创建远程仓库       配置Git 认识工作区、暂存区与版本库       添加文件到暂存区       将暂存区文件提交至本…

web期末个人引导页透明版

效果图 代码 css代码 * {box-sizing: border-box; }body {color: #2b2c48;font-family: "Jost", sans-serif;background-image: url(../img/bg.jpg);background-repeat: no-repeat;background-size: cover;background-position: center;background-attachment: fix…

在 PyCharm 中使用 Copilot

GitHub Copilot 由 OpenAI Codex 提供支持,可帮助用户在编辑器中实时工作。 它使用强大的 GPT-3 模型版本,该模型在大量开源代码上进行训练。 此外,GitHub Copilot 可在不同的 IDE(集成开发环境)上使用,包…