循环队列的队空队满情况

有题目:

循环队列放在一维数组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.mzph.cn/news/604580.shtml

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

相关文章

vim/vi 模式切换和常用快捷键

vim/vi 切换模式: vim/vi 常用快捷键: 一般模式: gg:文件开头、G:文件结尾 shift^ :光标当前行首、shift^:光标当前行尾 yy:复制、p:粘贴、dd:删除当前行、…

CRM的request管理笔记

1 request类型 request有两种,device request和link request。 link request link req是对link进行精确控制。 link req是对每个link的请求,比如某一帧是否需要bubble recovery、某一帧是否需要长曝光等feature。device request 对一个设备进行每帧控制…

JDK 11:崭新特性解析

JDK 11:崭新特性解析 JDK 11:崭新特性解析1. HTTP Client(标准化)示例代码 2. 局部变量类型推断的扩展示例代码 3. 新的字符串方法示例代码 4. 动态类文件常量示例代码 5. Epsilon 垃圾收集器使用方式 结语 JDK 11:崭新…

MySQL数据库进阶-事务

事务 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的。而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚。所有受到影 响的数据将返回到…

导致服务器重启的原因都有哪些,要如何处理

计算机重启主要作用是保存对系统的设置和修改以及立即启动相关服务等。重新启动的最通常的理由是因为新软件或硬件的安装需要,或因为应用软件因为一些理由没有回应。有时候,一些站长或GM在租用使用服务器过程,有时会遇到自动重启的情况。由于…

现有网络模型的使用及修改(VGG16为例)

VGG16 修改默认路径 import os os.environ[TORCH_HOME] rD:\Pytorch\pythonProject\vgg16 # 下载位置太大了(140多G)不提供直接下载 train_set torchvision.datasets.ImageNet(root./data_image_net, splittrain, downloadTrue, transformtorchvis…

数据库原理与应用期末复习试卷2

数据库原理技术与应用 一.单项选择题 设有属性A,B,C,D,以下表示中不是关系的是( C) ​ A、R(A) B、R(A, B, C, D) C、R(AxBxCxD) D、R(A,B) 在SQL语言中的视图VIEW是数据库的(A)…

Informer:用于长序列时间序列预测的高效Transformer模型

最近在研究时间序列分析的的过程看,看到一篇精彩的文章,名为:《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》,特此撰写一篇博客。 文章主要研究了一种用于长序列时间序列预测的高效Trans…

继承和多态中的常见面试题(二)

1. 什么是多态? 多种形态,不同的对象来完成同一行为,会产生不同的行为或状态。多态的构成有两个条件:必须通过基类的指针或引用来调用虚函数;被调用的函数必须是虚函数,且派生类要对这个虚函数进行重写。 …

Windows:笔记本电脑设置休眠教程

前言 不知道大家在使用【Windows】笔记本有没有这个习惯,我会把他的电池选项的【休眠】设置进行打开。因为作为我们开发人员电脑一般是一周关一次机,有时候一个月关一次机。这时候【休眠】功能就给我们提供了一个好处,我们选择了【休眠】后电…

大数据安全速通知识点

以下是关于我对于大数据安全这门课程的的知识大概归纳,欢迎批评指正~ 大数据安全首先要对大数据有一定了解。 什么是大数据? 大数据是指在一定时间内无法用常规软件进行捕捉、管理和处理数据集合,需要新的处理方式才能具有更强决策力、洞察发…

PAT 乙级 1056 组合数的和

给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。 输入格式: 输入在一行…

C语言编译器(C语言编程软件)完全攻略(第二十四部分:Turbo C 2.0使用教程(使用Turbo C 2.0编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 二十四、Turbo C 2.0使用教程&#xff08;使用Turbo C 2.0编写C语言程序&#xff09; 首先&#xff0c;我们给出一段完整的C语言代码&#xff1a; #include <stdio.h> int main() { puts("hello&#xff0c;world!"…

jumpServer-02-安装与配置

jumpServer-02-安装与配置 文章目录 jumpServer-02-安装与配置一、什么是jumpServer&#xff1f;二、jumpServer安装配置①&#xff1a;初始化配置01&#xff1a;Linux服务器准备02&#xff1a;环境准备&#xff0c;关闭防火墙03: 配置yum源04&#xff1a;安装系统初始化所需的…

Linux习题2

解析&#xff1a;虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存&#xff0c;使得每个进程看到的内存空间一致。 解析&#xff1a;所谓系统调用&#xff0c;就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的&…

Qt/QML编程学习之心得:Linux下读写文件File(24)

在Linux嵌入式系统中,经常会使用Qt来读写一个文件,判断一个文件是否存在,具体如何实现呢? 首先,要使用linux系统中相关的头文件: #include <unistd.h> #include <stdio.h> #include <stdlib.h> 其次,判断路径是否存在, if(!dir.exists()){mkdir(…

leetcode12 整数转罗马数字

题目描述&#xff1a;给定一个整数&#xff0c;将其转换为罗马数字。罗马数字由七个字符表示&#xff1a;I&#xff08;1&#xff09;、V&#xff08;5&#xff09;、X&#xff08;10&#xff09;、L&#xff08;50&#xff09;、C&#xff08;100&#xff09;、D&#xff08;5…

视频剪辑技巧:添加srt字幕,提升视频品质的方法

在视频制作和剪辑过程中&#xff0c;字幕的添加是一项常见的技巧。通过添加srt字幕&#xff0c;可以提升视频的品质和观感&#xff0c;让观众更好地理解视频内容。下面一起来看云炫AI智剪如何批量添加srt字幕的方法&#xff0c;如何通过这些技巧提升视频品质。 原视频画面与添…

Android 14 新特性代码 UUID.fromString Matcher.matches 的细节改动(扒源码)

文章目录 前言UUID 处理的更改正则表达式的更改结束 前言 Android 14 已经出来好久好久了… 今天其他的暂且不论&#xff0c;单纯的讲一下 OpenJDK 17 更新的两点变更&#xff08;扒源代码&#xff09;~ 对正则表达式的更改UUID 处理 首先&#xff0c;正则表达式的更改&…

JAVA中小型医院信息管理系统源码 医院系统源码

开发框架&#xff1a;SpringBootJpathymeleaf 搭建环境&#xff1a;jdk1.8idea/eclipsemaven3mysql5.6 基于SpringBoot的中小型医院信息管理系统&#xff0c;做的比较粗糙&#xff0c;但也实现了部分核心功能。 就诊卡提供了手动和读卡两种方式录入&#xff0c;其中IC读卡器使用…