算法通关村番外篇-数组实现队列

news2024/9/20 18:38:34

大家好我是苏麟 , 今天来用数组实现一下队列 .

数组实现队列

顺序存储结构存储的队列称为顺序队列,内部使用一个一维数组存储,用一个队头指针 front 指向队列头部节点(即使用int类型front来表示队头元素的下标),用一个队尾指针rear(有的地方会用tail,只要在一个问题里统一起来就行了),指向队列尾部元素(int类型rear来表示队尾节点的下标)。

初始化队列时: front = rear = -1(非必须,也可设置初始值为0,在实现方法时具体修改

队列满时: rear = maxSize - 1 (其中maxSize为初始化队列时,设置的队列最大元素个数)

队列为空时: front = rear

在代码中初始化了一个大小为6的顺序队列

其中 front 和 rear 指向的虚线框实际并不存在,仅用来表示初始化时的默认状态,因为我们实现的队列元素使用int存储元素,所以初始值均为 0(如用Objecl或范型则初始值为null),执行queue.add(1) 到queue.add(6)方 法后队列的状态如下图:

接下来看下队列的出队情况,当第一次执行queue.pop0方法后,队列元素如上图所示,此时队列剩下5个元素:

 当第六次执行queue.pop0方法后,队列元素如下图所示 :

此时队列中元素已全部出队,按正常逻辑应该可以添加元素到队列中,但此时添加元素却会报队列已满错误(rear=maxSize-1),当然即使前面元素未出队也会报相同错误。这就是我们常说的“假溢出”问题。为解决这个问题,就引出了我们的环形队列。 

代码实现

/**
 * 队列
 */
public class ArrayQueue {
    //队列存放的数据
    private int[] data;
    //队列大小
    private int maxSize;
    //队列头指针
    private int front;
    //队列尾指针
    private int rear;

    public ArrayQueue(int maxSize) {
        data = new int[maxSize];
        this.maxSize = maxSize;
        front = -1;
        rear = -1;
    }

    //判断队列是否满了
    public boolean isFull() {
        return rear == maxSize - 1;
    }

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

    //添加数据
    public void add(int n) {
        if (isFull()) {
            System.out.println("队列已满!");
            return;
        }
        data[++rear] = n;
    }

    //删除数据
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空 , 请先添加数据!");
        }
        int temp = data[++front];
        data[front] = 0;
        return temp;
    }

    //显示头部数据
    public void head() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空 , 请先添加数据!");
        }
        System.out.println(data[front + 1]);
    }

    //打印全部数据
    public void forEach() {
        if (isEmpty()) {
            System.out.println("队列为空 , 请先添加数据!");
        }
        for (int i = front + 1; i <= rear; i++) {
            System.out.print(data[i] + " ");
        }
    }
}

环形队列

在我们上面基于数组实现的队列中,假如头和尾都到了未尾,虽然这时候个空间是空的,但是无法插入新元素,为此,我们将其设计成环形结构。

环形队列,顾名思义即让普通队列首尾相连,形成一个环形。当 rear 指向尾元素后,当队列有元素出队时可以继续向队列中添加元素。这里使用 rear 指针指向最后一个节点的后一个元素,即会占用一个位置用来表示队列已满。

  • 初始化队列时: front = rear = 0
  • 队列满时: (rear +1) % maxSize == front(其中maxSize为初始化队列时,设置的队列最大元素
    个数)
  • 队列为空时: front == rear。

图解演示 :

入队演示 :

出队 , 入队演示 : 

所以这种方式会浪费一个空间来作为判满的条件 .

在这种场景下,环形队列有效元素个数为(rear - front + maxSize) % maxSize 。 (或者在内部定义一个size属性,当元素入队时size++,当出队时size--) 。因此在打印队列中元素时,从 front 位置开始至 front + size 位置结束来循环打印有效元素。

如果不实用环形队列方式实现队列,则会出现“假溢出”情况(即队列满后,将全部元素出队却不能继续添加元素的情况)。而环形队列会在队头元素出队后,将队尾指针rear重新分配为0,以达到循环使用队列空间的目的。

代码 :


/**
 * @className: CycleQueue
 * @author: SL 苏麟
 **/
public class CycleQueue {
    //队列存放的数据
    private int[] data;
    //队列大小
    private int maxSize;
    //队列头指针
    private int front;
    //队列尾指针
    private int rear;

    public CycleQueue(int maxSize) {
        data = new int[maxSize];
        this.maxSize = maxSize;
        front = 0;
        rear = 0;
    }

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

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

    //添加元素
    public void add(int n) {
        if (isFull()) {
            System.out.println("Queue is full!!!");
            return;
        }
        data[rear] = n;
        rear = (rear + 1) % maxSize;
    }

    //取出头元素
    public void head() {
        if (isEmpty()) {
            System.out.println("Queue is null!!!");
            return;
        }
        System.out.println("head : " + data[front]);
    }

    //头删
    public int pop() {
        if (isEmpty()) {
            throw new RuntimeException("Queue is null!!!");
        }
        int temp = data[front];
        front = (front + 1) % maxSize;
        return temp;
    }

    //打印队列
    public void printf() {
        if (isEmpty()) {
            throw new RuntimeException("Queue is null!!!");
        }
        for (int i = front; i < front + size(); i++) {
            System.out.print(data[i % maxSize] + " ");
        }
    }

    //返回队列大小
    public int size() {
        return (rear - front + maxSize) % maxSize;
    }
}

这期就到这里 , 下期见!

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

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

相关文章

HTTP 代理原理及实现(二)

在上篇《HTTP 代理原理及实现&#xff08;一&#xff09;》里&#xff0c;我介绍了 HTTP 代理的两种形式&#xff0c;并用 Node.js 实现了一个可用的普通 / 隧道代理。普通代理可以用来承载 HTTP 流量&#xff1b;隧道代理可以用来承载任何 TCP 流量&#xff0c;包括 HTTP 和 H…

【InnoDB数据存储结构】第2章节:InnoDB行格式

目录结构 之前整篇文章太长&#xff0c;阅读体验不好&#xff0c;将其拆分为几个子篇章。 本篇章讲解 InnoDB 行格式。 InnoDB 行格式 InnoDB 一行记录是如何存储的&#xff1f; 这个问题是本文的重点&#xff0c;也是面试中经常问到的问题&#xff0c;所以就引出了下文的 …

水面漂浮物监测识别摄像机

水面漂浮物监测识别摄像机是一种用于监测水体表面上漂浮物的高科技设备。它主要通过安装在水域周边的摄像头实时捕捉水面情况&#xff0c;利用图像识别技术自动识别和监测水面漂浮物。这种设备在环境保护、水域清洁和水质监测等方面具有广泛的应用价值。 水面漂浮物包括各类垃圾…

vc2017编译从github网站上下载的源码

以ZLmediakit为例 1.下载软件 cmakehttps://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5-windows-x86_64.zip Microsoft Visual Studio https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_ido~msft~vscom~older-downloads …

一文搞懂SiLM824x系列SiLM8243BBCL-DG 双通道死区可编程隔离驱动 主要特性与应用 让技术变得更有价值

SiLM824x系列SiLM8243BBCL-DG是一款具有不同配置的隔离双通道门极驱动器。SiLM8243BBCL-DG配置为高、低边驱动&#xff0c;SiLM8243BBCL-DG可提供4A的输出源电流和6A的灌电流能力&#xff0c;并且其驱动输出电压可以支持到33V。支持死区可编程&#xff0c;通过调整DT脚外部的电…

Ansible、Saltstack、Puppet自动化运维工具介绍

本文主要是分享介绍三款主流批量操控工具Ansible、Saltstack、Puppet主要对比区别&#xff0c;以及Ansible和saltstack的基础安装和使用示例&#xff0c;如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; There are many things that can not be broken&am…

LeetCode刷题---矩阵置零

解题思路&#xff1a; 本题要求原地置换元素 对矩阵进行第一轮遍历&#xff0c;使用第一行第一列来充当该行该列是否要置换为0的标记位&#xff0c;如果第一行或第一列本身就含有零元素&#xff0c;我们使用colZero和rowZero变量来对其标记。如果第i行第j列的那个元素为0&#…

互联网分布式应用之SpringDataJPA

SpringDataJPA Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. Spring整合Hibernate 2…

Spring配置文件

一&#xff1a; Bean标签基本配置 1&#xff1a;用途 用于配置对象交由Spring来创建&#xff0c;默认情况下它调用的是类中的无参构造函数&#xff0c;如果没有无参构造函数则不能创建成功。 2&#xff1a;基本属性&#xff08;id&#xff09; Bean实例在Spring容器中的唯一…

APK 瘦身

APK 瘦身的主要原因是考虑应用的下载转化率和留存率&#xff0c;应用太大了&#xff0c;用户可能就不下载了。再者&#xff0c;因为手机空间问题&#xff0c;用户有可能会卸载一些占用空间比较大的应用&#xff0c;所以&#xff0c;应用的大小也会影响留存率。 1 APK 的结构 …

台灯哪个品牌比较护眼?2024学生考研台灯推荐

在近几年&#xff0c;儿童青少年近视率非常高。很多家长认为孩子近视的原因是没有养成正确的用眼习惯&#xff0c;例如经常趴桌子写作业、眯眼看书等&#xff0c;但实际上这些坏习惯是因为没有合适的光线而导致的。所以安排一盏合适的台灯给孩子学习是非常重要的。但是市面上护…

Pruning Papers

[ICML 2020] Rigging the Lottery: Making All Tickets Winners 整个训练过程中mask是动态的&#xff0c;有drop和grow两步&#xff0c;drop是根据权重绝对值的大小丢弃&#xff0c;grow是根据剩下激活的权重中梯度绝对值生长没有先prune再finetune/retrain的两阶段过程 Laye…

el-table 展开行表格,展开的内容高度可以变化时,导致的固定列错位的问题

问题描述 一个可展开的表格&#xff08;列设置了type“expand”&#xff09;&#xff0c;并且展开后的内容高度可以变化&#xff0c;会导致后面所有行的固定列错位&#xff0c;图如下&#xff0c;展示行中是一个树形表格&#xff0c;默认不展示子级&#xff0c;点击树形表格的…

【金猿CIO展】现代咨询CIO崔恩博:数字化转型,CIO不仅要懂技术和业务,更要“懂人”...

‍ 崔恩博 本文由现代咨询CIO崔恩博撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度优秀CIO榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 最近几年&#xff0c;大数据行业的发展备受关注&#xff0c;尤其是2019年以后&#xff0c;随着企业…

异步优势演员-评论家算法 A3C

异步优势演员-评论家算法 A3C 异步优势演员-评论家算法 A3C网络结构并行步骤 异步优势演员-评论家算法 A3C A3C 在 A2C 基础上&#xff0c;增加了并行训练&#xff08;异步&#xff09;来提高效率。 网络结构 A2C&#xff1a; A3C&#xff1a; 在这两张图之间&#xff0c;…

Spring事务传播问题 — PROPAGATION_REQUIRES_NEW

一、描述 Spring遇到嵌套事务时&#xff0c;当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时&#xff0c; 内层Service的方法被调用时&#xff0c;外层方法的事务被挂起&#xff1b; 内层事务相对于外层事务是完全独立的&#xff0c;有独立的隔离性等等。 二、实验 但实…

判断一个给定的数组是否是Fortran连续的np.isfortran()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断一个给定的数组 是否是Fortran连续的 np.isfortran() [太阳]选择题 以下代码的输出结果中正确的是? import numpy as np A np.array([[1, 2], [3, 4]]) B np.array([[1, 2], [3, 4]]…

ETLCloud X 明道云实现无缝数据连接

明道云作为一款云端协作工具&#xff0c;为企业提供高效的沟通、协作和数据分析服务。它可以实现企业内部沟通和协作的高效性和一体化&#xff0c;并提供数据分析功能&#xff0c;让企业能够更好地理解业务和决策。 一、传统方式同步数据的痛点 传统方式同步数据需要手动进行…

Navicat(数据库可视化软件)安装教程以及连接MYSQL

Navicat安装教程以及连接MYSQL Navicat&#xff08;数据库可视化软件&#xff09;安装流程安装MySQLnavicat连接mysql数据库 Navicat&#xff08;数据库可视化软件&#xff09; Navicat 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具&#xff0c;我们可以在自己的计算机…

网络安全—部署CA证书服务器

文章目录 网络拓扑安装步骤安装证书系统安装从属证书服务器 申请与颁发申请证书CA颁发证书 使用windows Server 2003环境 网络拓扑 两台服务器在同一网段即可&#xff0c;即能够互相ping通。 安装步骤 安装证书系统 首先我们对计算机名进行确认&#xff0c;安装了证书系统后我…