Java循环队列

news2025/1/21 2:50:16

目录

一、循环队列

二、设计循环队列


一、循环队列

队列:只能在一端进行插入数据操作,另一端进行删除数据操作的特殊线性表,是一种先进先出的存储结构

插入操作的一端为队尾,删除操作的一端为队头

在线性队列中,一旦队列满了,即使队列的前面有空间,我们也不能插入下一个元素,这时,我们可以使用循环队列,来使用这些空间存储新的值

循环队列: 队头和队尾相连接的队列

二、设计循环队列

我们使用数组来实现循环队列,通过构造器,来创建队列,并设置队列的大小为n

class MyCircularQueue {
    private int[] elem;
    private int front;
    private int rear;
    private int size;
    public MyCircularQueue(int n) {
        elem = new int[n+1];
        front = rear = 0;
        size = n + 1;
    }
}

 在创建队列时,我们预留一个空间,以便判断队列满和计算队列元素个数

判断循环队列是否为空

当队头和队尾指向同一位置时,队列是空的


public boolean isEmpty() {
    return front == rear;
}

判断循环队列是否已满

若队尾的下一个位置是队头,那么循环队列已满

 当rear指向最后一个位置时,+1会造成越界,此时我们通过取余(%),让其指向0位置处

public boolean isFull() {
    return ((rear+1)%size == front);
}

添加数据

首先判断队列是否已满,若已满,添加失败,返回false,若没有,则在队尾rear位置添加数据,并将rear向后移动

public boolean enQueue(int value) {
    //判断队列是否满
    if(isFull()){
        return false;
    }else {
        elem[rear] = value;
        rear = (rear+1)%size;
        return true;
    }
}

删除数据

首先判断队列是否为空,若为空,删除失败,返回false,若不为空,则将front向后移动

    public boolean deQueue() {
        //队列是否为空
        if(isEmpty()){
            return false;
        }else {
            front = (front + 1) % size;
            return true;
        }
    }

获取队头元素

首先判断队列是否为空,若为空,队列中无元素,抛出异常,若不为空,返回队头元素,并将front向后移动

public int getFront() {
    if(isEmpty()){
        throw new RuntimeException("队列为空,无元素!");
    }else {
        int val = elem[front];
        front = (front + 1) % size;
        return val;
    }
}

计算队列中元素个数

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

完整代码

class MyCircularQueue {
    private int[] elem;
    private int front;
    private int rear;
    private int size;
    public MyCircularQueue(int n) {
        elem = new int[n+1];
        front = rear = 0;
        size = n + 1;
    }
    public boolean isEmpty() {
        return front == rear;
    }

    public boolean isFull() {
        return ((rear+1)%size == front);
    }

    public boolean enQueue(int value) {
        //判断队列是否满
        if(isFull()){
            return false;
        }else {
            elem[rear] = value;
            rear = (rear+1)%size;
            return true;
        }
    }

    public boolean deQueue() {
        //队列是否为空
        if(isEmpty()){
            return false;
        }else {
            front = (front + 1) % size;
            return true;
        }
    }
    public int getFront() {
        if(isEmpty()){
            throw new RuntimeException("队列为空,无元素!");
        }else {
            int val = elem[front];
            front = (front + 1) % size;
            return val;
        }
    }
    public int size(){
        return (rear + size - front) % size;
    }
}

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

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

相关文章

leetcode 62. 不同路径、63.不同路径||

62. 不同路径 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径&…

课题学习(三)----倾角和方位角的动态测量方法(基于陀螺仪的测量系统)

一、内容介绍 该测量系统基于三轴加速度和三轴陀螺仪,安装在钻柱内部,随钻柱一起旋转,形成捷联惯性导航系统,安装如下图所示:   假设三轴加速度和陀螺仪的输出为: f b [ f x f y f z ] T f^b\begin{bmatrix}f_{x} …

C++ 学习系列 -- std::list

一 std::list 介绍 list 是 c 中的序列式容器,其实现是双向链表,每个元素都有两个指针,分别指向前一个节点与后一个节点 链表与数组都是计算机常用的内存数据结构,与数组连续内存空间不一样的地方在于,链表的空间是不…

Springboot实现登录功能(token、redis、登录拦截器、全局异常处理)

登录流程: 1、前端调用登录接口,往接口里传入账号,密码 2、根据账号判断是否有这个用户,如果有则继续判断密码是否正确 3、验证成功后,则是根据账号,登录时间生成token(用JWT) 4、将…

64位Office API声明语句第111讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

企业使用SSL证书对于SEO有多重要

在当今竞争激烈的在线市场中,搜索引擎优化(SEO)是企业获得更高排名和增加网站流量的关键。在SEO策略中,企业使用SSL证书已经成为多重不可忽视的重要因素。让我们一起探究企业使用SSL证书对于SEO的重要性。 首先,搜索引…

socket.error: [Errno 10049]错误

今天在pycharm运行rl_server_no_training.py欲启动服务器时&#xff0c;却出现如下错误 Traceback (most recent call last):File "xxx/rl_server_no_training.py", line 333, in <module>main()File "xxx/rl_server_no_training.py", line 326, in…

【C++】运算符重载 ⑧ ( 左移运算符重载 | 友元函数 / 成员函数 实现运算符重载 | 类对象 使用 左移运算符 )

文章目录 一、左移运算符重载1、友元函数 / 成员函数 实现运算符重载2、类对象 使用 左移运算符3、左移运算符 << 重载 二、完整代码示例 一、左移运算符重载 1、友元函数 / 成员函数 实现运算符重载 运算符重载 的正规写法一般都是 使用 成员函数 的形式 实现的 ; 加法…

DLRover - 小记

文章目录 关于 DLRover 关于 DLRover github : https://github.com/intelligent-machine-learning/dlrover DLOver使大型人工智能模型的分布式训练变得简单、稳定、快速和绿色。 它可以在分布式集群上自动训练深度学习模型。 它帮助模型开发人员专注于模型结构&#xff0c;而…

手把手教你从零开始腾讯云服务器部署(连接建站教程)

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com分享使用腾讯云服务器建站教程&#xff0c;…

双周回顾#001 - 火烧云

工作以来&#xff0c;许久未曾见过如此壮观的火烧云景观了。 文章 1、穿透的 DIV &#xff08;pointer-events&#xff09;1 pointer-events 是一个蛮有趣的 CSS3 属性&#xff0c;虽然主要是针对 SVG &#xff0c;但其中几个属性应用在 div 上也是颇有意思。 顾名思义&…

学会自我投资:美团四大名著之<高效能人士的七个习惯>

你有没有这些问题&#xff1f;如果有&#xff0c;那么本文也许对你有用。 受害者心理&#xff0c;如果有人对你说粗话&#xff0c;就怼回去。消极被动。 没有计划。没有目标。不会担心自己的行为带来的后果。随波逐流。及时行乐&#xff0c;做个玩世不恭者。 拖延。总是先做紧…

vue +element 批量删除

1.拿到当前勾选状态 在el-table里边去写 单选用第一个 多选用第二个 select"selectHandle" :当用户手动勾选数据行的 Checkbox 时触发的事件 select-all"selectHandle":当用户手动勾选全选 Checkbox 时触发的事件// 点击勾选选择器selectHandle(selection…

机器学习:决策树

决策树 决策树是一种基于树形结构的模型&#xff0c;决策树从根节点开始&#xff0c;一步步走到叶子节点&#xff08;决策&#xff09;&#xff0c;所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归。 特征选择 根节点的选择该用哪一个特征呢&#xff…

【python海洋专题十二】年平均的南海海表面温度图

【python海洋专题十二】年平均的南海海表面温度图 上期内容 南海水深图 本期内容 年平均的南海平面温度图 数据来源 NCEP/DOE Reanalysis II: NOAA Physical Sciences Laboratory NCEP/DOE Reanalysis II skt.skt.sfc.mon.ltm.nc Part01. 本文重点内容 前几期地形图&a…

SSM - Springboot - MyBatis-Plus 全栈体系(二十一)

第四章 SpringMVC 四、RESTFUL 风格设计和实战 1. RESTFul 风格概述 1.1 RESTFul 风格简介 RESTful&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量…

QT基础入门——QMainWindow与对话框QDialog

前言&#xff1a; Qt 并没有专门的菜单项类&#xff0c;只是使用一个QAction类&#xff0c;抽象出公共的动作。当我们把QAction对象添加到菜单&#xff0c;就显示成一个菜单项&#xff0c;添加到工具栏&#xff0c;就显示成一个工具按钮。用户可以通过点击菜单项、点击工具栏按…

visual studio解决bug封装dll库

1.速度最大化 O2 2.设置输出目录 配置属性/常规/输出目录 链接器/常规/输出dll文件 链接器/调试/输出程序数据库pdb文件 链接器/高级/导入库 3.输出X86 X64分别对应的dll、lib、pdb 然后修改更新说明 更新说明格式如下&#xff1a; 4.将库提交到FTP每日更新库文档下 和测试交接…

运维/全栈必备Window指令

运维/全栈必备Window指令 前言 大家好 我是寸铁 除了Linux有常用的命令 Windows也有 下面让我们一起来看看吧! 总共是40个命令&#xff0c;按照前缀大致划分成25个命令。 便于系统学习和掌握。 需要用到的快捷键&#xff1a; 复制键&#xff1a; ctrl insert退出键&#x…

JTAG/SWD接口定义

目录 1. ST-Link接口定义 2. ULINK2接口定义 为方便查阅&#xff0c;将ST-LINK和ULINK的JTAG和SWD接口定义总结如下&#xff1a; 1. ST-Link接口定义 Pin no. ST-LINK/V2 connector (CN3) ST-LINK/V2 function Target connection (JTAG) Target connection (SWD) 1 VA…