数组模拟实现环形队列

news2024/11/26 4:33:59

目录

前言

一、什么是队列?

二、数组模拟非环形队列的实现

三 . 数组模拟环形队列

总结


前言 

笔者: 最爱吃兽奶

博文内容: 数据结构队列的模拟实现

这篇博客理解起来或许没有那么简单,我尽力讲的容易理解一点,接下来跟我一起去看看吧!


一、什么是队列?

队列是一种特殊的线性数据结构,它遵循先进先出(First In First Out,FIFO)的原则。队列可以看作是一种排队的数据结构,类似于现实生活中的排队。在队列中,新元素被添加到队列的末尾,而从队列中移除元素的操作只能从队列的前端进行。

上图八个小球按序号依次入队列 

队列有两个基本操作:入队(enqueue)和出队(dequeue)。入队操作将一个元素添加到队列的末尾,而出队操作则从队列的前端移除一个元素。除了入队和出队操作,队列还可以支持其他操作,如获取队列的长度、判断队列是否为空等。

队列的应用场景:银行排队案例

二、数组模拟非环形队列的实现

图解:

分析: 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如上图, 其中 maxSize 是该队列的最大容量。因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front及 rear分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear则是随着数据输入而改变

代码实现:

下面给出基础代码,入队列/出队列的方法我们单独来实现

public class QueueDemo {
    private int capacity;
    private int front;
    private int rear;
    private int[] Queue;
    
    public QueueDemo(int capacity){
        this.capacity = capacity;
        Queue = new int[capacity];
        front = -1;
        rear = -1;
    }
}
// 判断队列是否已满
private Boolean IsFull(){
    return rear == capacity-1;
}

// 判断队列是否为空
private Boolean IsEmpty(){
    return rear == front;
}

入队列

 

public void addQueue(int data) throws Exception {
    if(IsFull()){
        throw new RuntimeException("队列已满,无法插入新的数据");
    }
    arr[++rear] = data;
}

出队列

public void getQueue(){
    if(IsEmpty()){
        throw new RuntimeException("队列为空,无法出队列!");
    }
    front++;// front 后移
}

 问题分析: 可以清楚地看到上面队列并不是可重复利用队列,而实际上的队列则是可以重复利用的,在这里引出环形队列。

三 . 数组模拟环形队列

思路如下:

1.  front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素

front 的初始值 = 0

2.  rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定.

rear 的初始值 = 0

3. 当队列满时,条件是  (rear  + 1) % maxSize == front 【

4. 对队列为空的条件, rear == front

5. 当我们这样分析, 队列中有效的数据的个数   (rear + maxSize - front) % maxSize   // rear = 1 front = 0

为什么要留出一个空间作为约定?

如果不留一个空间作为约定,队满和队空的条件就一样了,我们无法区分队满还是队空,所以要留出一个空间作为约定

 

下面给出代码具体实现
public class circleQueue {
    private int QueueSize;// 队列容量
    private int front;// 队列首部
    private int rear;// 队列尾部
    private int[] arr;// 该数组用于存放数据,模拟队列

    // 构造器
    public circleQueue(int maxSize){
        QueueSize = maxSize;
        front = 0;// 指向队列头部,指向队列头的第一个位置
        rear = 0;// 指向队列尾部,指向队列尾部最后一个元素的下一个位置
        // 约定预留一个空间,如果不预留空间,满和空的条件将会重合
        arr = new int[maxSize];
    }

    // 判断是否为空
    public boolean isNull(){
        return rear == front;
    }

    // 判断是否已满
    public boolean isFull(){
        return (rear+1)% QueueSize == front;
    }

    // 入队列
    public void addQueue(int n){
        if(isFull()){
            throw new RuntimeException("队列已满,不能在增加数据");
        }
        arr[rear] = n;
        rear = (rear+1)%QueueSize;
    }

    // 出队列
    public int getQueue(){
        if(isNull()){
            throw new RuntimeException("队列为空,不能取数据");
        }
        int value = arr[front];
        front = (front+1)%QueueSize;
        return value;
    }

    // 显示队列
    public void showQueue(){
        if(isNull()){
            throw new RuntimeException("队列为空");
        }
        for (int i = front; i <front+getSize() ; i++) {
            System.out.printf("arr[%d] = %d ",i%QueueSize,arr[i%QueueSize]);
        }
    }

    // 显示队列的头数据(不是取数据)
    public void showHead(){
        if(isNull()){
            throw new RuntimeException("队列为空");
        }
        System.out.println("头数据为"+arr[front]);
    }

    public int getSize(){
        return (rear-front+QueueSize)%QueueSize;
    }
}

总结

大家有条件还是敲一敲比较好,能看明白是一回事,敲出来又是另一回事。

其中%是关键,这一点需要自己理解,光打字解释解释不清楚,大家重点理解一下。

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

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

相关文章

#452. 序列操作

序列操作 - 题目 - Daimayuan Online Judge 问题描述&#xff1a; 思路&#xff1a;首先想的是第二次操作的y可以将前面所以操作进行抵消&#xff0c;只需要第二次操作的最大值即可。但是发现&#xff0c;对于第一个操作&#xff0c;它是单点修改&#xff0c;每修改一次对于第…

2023年7月京东投影仪行业品牌销售排行榜(京东大数据)

鲸参谋监测的京东平台7月份投影仪行业销售数据已出炉&#xff01; 7月份&#xff0c;投影仪市场呈现增长趋势。根据鲸参谋平台的数据可知&#xff0c;7月京东平台投影仪的销量将近20万&#xff0c;同比增长约16%&#xff1b;销售额将近3.8亿&#xff0c;同比增长约4%。 ​*数据…

机器人中的数值优化(十一)——高斯牛顿法、LMF方法、Dogleg方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

MySQL——MySQL的基础操作部分

使用命令行登录 mysql -u root -p 直接敲击回车后输入密码即可&#xff1a; 当看到出现“mysql>“的符号之后&#xff0c;就表示已经进入到了&#xff2d;&#xff59;&#xff33;&#xff31;&#xff2c;系统中&#xff0c;就可以输入&#xff2d;&#xff59;&#xf…

Streamlit项目:乐高风格马赛克设计工坊~打造个性化马赛克图案的平台

文章目录 1 前言2 项目概述2.1 项目背景和目标2.2 功能和特性2.3 技术实现2.4 开发计划2.5 预期成果2.6 应用场景 3 使用指南3.1 源代码使用指南3.2 普通网页用户使用指南3.3 文件保存3.3.1 导出图像文件3.3.2 获取像素RGB数据 3.4 注意事项 4 实现细节4.1 准备工作4.2 编写代码…

如何手动读取 GLTF/GLB 文件

推荐&#xff1a;使用NSDT场景编辑器快速搭建3D应用场景 文件类型 GLTF文件有两种不同的主要文件类型&#xff1a;.gltf和.glb。 GLTF文件本质上只是一个重新命名的json文件&#xff0c;它们通常与包含顶点数据等内容的.bin文件相提并论&#xff0c;但这些内容也可以直接包含…

聊聊大模型位置编码及其外推性

作者 | 王嘉宁 整理 | NewBeeNLP https://wjn1996.blog.csdn.net/article/details/131753251 大家好&#xff0c;这里是 NewBeeNLP。 现如今很多大模型都开始支持超过4096长度的推理&#xff0c;例如GPT-4支持超过30k&#xff0c;ChatGLM2-6B也支持最长为32K的文本。但是由于显…

CentOS7安装时直接跳过了安装信息摘要页面的解决方法

最近在配置Hadoop虚拟机的时候&#xff0c;创建的centos7虚拟机在安装信息摘要时直接自动跳过&#xff0c;直接跳到设置用户名和密码&#xff0c;在重复多次的重新删除安装后发现了问题所在&#xff1a; 在进行到选择操作系统来源时&#xff0c;注意是否出现“该操作系统将使用…

matplotlib设置绘图中文标记

项目场景 使用matplotlib时为图形设置x轴标记&#xff0c;y轴标记&#xff0c;标题默认只能使用英文&#xff0c;当使用中文时会出现以下错误&#xff1a; UserWarning: Glyph 32654 (\N{CJK UNIFIED IDEOGRAPH-7F8E}) missing from current font. 解决方法 在引入matplotl…

成功的硬件公司不仅是产品,更是一种创新文化

目录 内容简介 客户 建立公司&#xff0c;而不仅仅是产品 CSDN学院 作者简介 内容简介 很多时候&#xff0c;你决定去做一件事、一款产品&#xff0c;往往都始于一个想法、一个灵感。 然后&#xff0c;许多硬件创业者会花费数月、甚至是数年的时间来确定并分析他们的想法…

基于ITIL的ITSM工具

随着企业的ITSM(IT服务管理)的逐渐成熟进而深入应用&#xff0c;如果您希望以低成本寻找一款基于ITIL的ITSM管理工具&#xff0c;然后那么卓豪ServiceDesk Plus将是您性价比高的免费ITSM、工单系统选择。因为它提供全面的ITSM和资产管理能力&#xff0c;更重要的是&#xff0c;…

java八股文面试[多线程]——CompletableFuture

1 CompletableFuture介绍 平时多线程开发一般就是使用Runnable&#xff0c;Callable&#xff0c;Thread&#xff0c;FutureTask&#xff0c;ThreadPoolExecutor这些内容和并发编程息息相关。相对来对来说成本都不高&#xff0c;多多使用是可以熟悉这些内容。这些内容组合在一起…

全国唯一一所初试考Java的学校!平均300分拿下

苏州科技大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1187字&#xff0c;预计阅读&#xff1a;3分钟 2023考情概况 苏州科技…

澳大利亚纽扣电池/含纽扣电池商品合规认证详细解答

近期收到很多客户前来咨询亚马逊澳洲站纽扣电池或含纽扣电池商品的合规性认证&#xff0c;和我说我做了认证了&#xff0c;为什么还是审核不通过&#xff0c;审核被拒呢&#xff1f; 一般是两种情况&#xff1a; 一&#xff1a;检测标准没有做对或对亚马逊合规政策的标准有误…

四川玖璨电子商务有限公司:短视频及直播运营

​ &#xfeff;短视频及直播运营是当下最火热的互联网行业之一&#xff0c;它以轻松、有趣的方式改变了人们的生活和娱乐方式。作为一名短视频及直播运营实训学员&#xff0c;我有幸得到了具体的操作指导和实践机会&#xff0c;让我对这个行业有了更深入的了解。 在短视频及直…

怎么激活IDM

IDM是一个下载软件。 激活它需要用到git上面的一个项目&#xff0c;同时网络要能连到github GitHub - lstprjct/IDM-Activation-Script: IDM Activation & Trail Reset Script WINR 输入powershell 输入命令行 iex(irm is.gd/idm_reset) 或者 iwr -useb https://raw.…

numba,一个强大的 python 库

今天给大家分享一个强大的 python 库&#xff0c;numba。 https://github.com/numba/numba Pandas 是 Python 中流行的数据分析库。然而&#xff0c;随着数据集大小的增长&#xff0c;原生 Python 代码对于滚动窗口计算等关键操作可能会变得很慢。这就是 Numba 用武之地。 N…

一种编程语言,

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

EVE部署

EVE-NG 镜像导入 IOL 镜像位置&#xff1a;/opt/unetlab/addons/iol/bin/ qemu 镜像位置&#xff1a;/opt/unetlab/addons/qemu/ 设备图标位置&#xff1a;/opt/unetlab/html/images/icons/ EVE-NG 懒人版部署

长胜证券:中特估一带一路央国企将见底反转加速

三季度开始龙头成绩将回转加快向上。(1)2022年第三季度基数环比下降&#xff0c;如2022第2/3单季度成绩增速:我国中铁14%/5%、我邦交建10%/-9%、我国铁建8%/-5%、我国中冶14%/-29%、我国化学50%/11%、北方世界38%/-50%、中工世界80%/20%。(2)在手订单增速高于收入增速&#xff…