循环队列的队空队满情况

有题目:

循环队列放在一维数组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.mfbz.cn/a/300291.html

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

相关文章

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

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

逆置算法和数组循环移动算法

元素逆置 概述:其实就是将 第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依次到中间位置。用途:可用于数组的移动,字符串反转,链表反转操作,栈和队列反转等操作。 逆置图解 …

Cadence Editor 关于画PCB相关内容

目录 一 新建PCB文件 二 指定封装库 三 导入网表 四 放置器件 五 绘制板框 六 精准定位 七 原理图与PCB的交互 八 飞线设置 九 层管理 布局布线阶段需要显示的层 十 器件位置相关 1 器件选取的基准点 2 旋转 3 对齐 4 把器件移动到底层或顶层 5 锁定与解锁 6…

【MySQL】事务管理

文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务的相关演示事务的隔离级别查看与设置隔离级别读未提交(Read Uncommitted)读提交(Read Committed)可重复读(Repeatable Read)串行化&a…

IDEAVsCode常用插件

IDEA&VsCode常用插件 IDEA lombok、mybatisx 插件 Vscode Vetur —— 语法高亮、智能感知、Emmet 等,包含格式化功能, AltShiftF (格式化全文),CtrlK CtrlF(格式化选中代码,两个 Ctrl需…

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现CNN-LSTM-KDE的卷积长短期神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CNN-LSTM-KDE多变量时间序列区…

Ubuntu无网络解决办法

1.进入root并输入密码 sudo su 2.更新NetworkManager的配置 用vim打开NetworkManager.conf vim /etc/NetworkManager/NetworkManager.conf 将第五行 managedFalse 改为 managedTrue 。 如果本身就是True就不用改了。 3.删除NetworkManager配置 service NetworkManager st…

el-date-picker日期时间选择器限制可选的日期范围

业务场景&#xff1a;需要限制日期时间选择器可选择的日期&#xff0c;有两种模式&#xff0c; 一种是已知范围&#xff0c;只能选已知范围内的日期&#xff0c; 另一种是知道最近天数&#xff0c;只能选今天往前的天数内的日期&#xff0c;超出不能选。 <el-date-picker v-…

Redis反序列化的一次问题

redis反序列化的一次问题 1. 问题描述 springbootredis不少用&#xff0c;但是一直没遇到什么问题&#xff0c;直接代码拷贝上去就用了。这次结合spring-security&#xff0c;将自定义的spring-security的UserDetails接口的实现类SecurityUser&#xff0c;反序列化取出时报错…

【解决】hosts文件无修改权限问题

1. 以管理员身份运行命令提示符&#xff08;cmd&#xff09;&#xff1a; 2. 在cmd中输入notepad进入记事本&#xff1a; 3. 通过记事本打开hosts文件&#xff1a; 4. 修改并保存&#xff1a;

系列六、MindManager取消首字母自动大写

一、MindManager取消首字母自动大写 1.1、步骤 主页>字体>设置字体样式>格式字体>文本和大写>文本大写>无 1.2、参考 https://tieba.baidu.com/p/3752136361

UI动效设计师通往高薪之路,AE设计从基础到进阶教学

一、教程描述 UI动效设计&#xff0c;顾名思义即动态效果的设计&#xff0c;用户界面上所有运动的效果&#xff0c;也可以视其为界面设计与动态设计的交集&#xff0c;或者可以简单理解为UI设计中的动画效果&#xff0c;是UI设计中不可或缺的组成部分。现在UI设计的要求越来越…

如何写html邮件 —— 参考主流outook、gmail、qq邮箱渲染邮件过程

文章目录 ⭐前言⭐outlook渲染邮件⭐gmail邮箱渲染邮件⭐qq邮箱渲染邮件 ⭐编写html邮件&#x1f496;table表格的属性&#x1f496;文本&#x1f496;图片&#x1f496;按钮&#x1f496;背景图片 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 …

PEFT: 在低资源硬件上对十亿规模模型进行参数高效微调

1 引言 最近&#xff0c;深度学习的研究中出现了许多大型预训练模型&#xff0c;例如 GPT-3、BERT 等&#xff0c;这些模型可以在多种自然语言处理任务中取得优异的性能表现。而其中&#xff0c;ChatGPT 模型因为在对话生成方面的表现而备受瞩目&#xff0c;成为了自然语言处理…

链表

目录 单链表 双链表 单链表 题目如下&#xff1a;模拟一个单链表&#xff0c;实现插入删除操作 解题代码 #include <iostream>using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示节点i的值 // ne[i] 表示节点i的next指针是多少 // idx …

vmlinux, vmlinux.bin, bzImage; cmake的find_package(Clang)新增了哪些变量( 比较两次记录的所有变量差异)

vmlinux, vmlinux.bin, bzImage cd /bal/linux-stable/ file vmlinux #vmlinux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=b99bbd9dda1ec2751da246d4a7ae4e6fcf7d789b, not stripped #文件大小 20MB, 19940148Bfile ar…

小程序组件内的数据监听器

数据监听器可以用于监听和响应任何属性和数据字段的变化。从小程序基础库版本 2.6.1 开始支持。 有时&#xff0c;在一些数据字段被 setData 设置时&#xff0c;需要执行一些操作。例如&#xff0c; 一个值取决于另外两个值的变化&#xff0c;this.data.sum 永远是 this.data.…

学习笔记 | Kafka

一、概述 定义 1、Kafka传统定义&#xff1a;Kafka 是一个分布式的基于 发布/订阅模式 的消息队列&#xff08;Message Queue&#xff09; &#xff0c;主要应用与大数据实时处理领域。 2、发布/订阅&#xff1a;消息的发送者不会将消息直接发送给特定的订阅者&#xff0c;而…

localhost和127.0.0.1的区别是什么

今天在网上逛的时候看到一个问题&#xff0c;没想到大家讨论的很热烈&#xff0c;就是标题中这个&#xff1a; localhost和127.0.0.1的区别是什么&#xff1f; 前端同学本地调试的时候&#xff0c;应该没少和localhost打交道吧&#xff0c;只需要执行 npm run 就能在浏览器中打…

光速爱购--靠谱的SpringBoot项目

简介 这是一个靠谱的SpringBoot项目实战&#xff0c;名字叫光速爱购。从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目。 教程路线是&#xff1a;搭建环境> 安装软件> 创建项目> 添加依赖和配置> 通过表生成代码> 编写Java代码&g…