广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java数组队列及环形数组队列超详细讲解
  • 869
分享到

Java数组队列及环形数组队列超详细讲解

2024-04-02 19:04:59 869人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、队列1、基本介绍2、示意图3、队列的特点二、数组模拟队列1、数组队列初始化2、判断方法3、增删改查的方法4、注意三、数组模拟环形队列1、初始化2、判断方法3、增删改查的方法一

一、队列

1、基本介绍

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

2、示意图

3、队列的特点

先进先出:

在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又被称为先进先出。

二、数组模拟队列

1、数组队列初始化

根据图示进行初始化:

class ArrayQueue{
    private int maxSize; //表示数组最大容量
    private int front; //队列头
    private int rear; //队列尾
    private int[] arr; //该数组用于存放数据,模拟队列
    //创建队列构造器,进行初始化
    public ArrayQueue(int arrMaxSize){
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1; //front指向队列头的前一个位置
        rear = -1; //指向队列尾
    }
}

2、判断方法

判断队列是否为空

front 是指向队列的头的前一个位置,rear是指向队列的尾,当front和rear重合时,队列为空。

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

判断队列是否满

因为数组有最大容量,所以直接判断rear(队列尾)是否在数组的最后位置。数组的下标从零开始。

public boolean isFull(){
        return rear == maxSize - 1;
    }

3、增删改查的方法

向队列中添加数据,入队列

▷ 添加数据首先判断数组是否满,如果满,则无法添加数据,数组未满则只需要动 rear(进行尾部移动),rear先加一,然后在数组中存放数据。

    //添加数据到队列
    public void addQueue(int n){
        //判断队列是否满
        if(isFull()){
            System.out.println("队列满,不能再添加");
            return;
        }
        rear++; //让rear后移
        arr[rear] = n;
    }

删除队列中数据,出队列

▷ 因为队列的特点先进先出,所以我们需要动队列的头,当然首先应该判断队列是否为空,为空则不能出队列;然后(front是指向队列头的前一个位置)先将front 加一到达队列的头的位置,再把这个值返回即可。有人可能会问队列的头呢?当front == -1时,数组下标为0 的数据为头,一旦front进行加一后,数组下标为1的数据就为头了,也就是当front进行变化后队列的头就变了。

    //获取队列数据,出队列
    public int getQueue(){
        //判断队列是否为空
        if(isEmpty()){
            //通过抛出异常
            throw new RuntimeException("队列为空,不能获取数据");
        }
        front++; //front后移
        return arr[front];
    }

显示队列中所有数据

▷ 因为是数组模拟的队列,将数组进行遍历输出即可。

    //显示队列的所有数据
    public void showQueue(){
        //判断是否为空
        if(isEmpty()){
            System.out.println("队列为空,没有数据");
            return;
        }
        //遍历
        for(int i = 0; i < arr.length ; i++){
            System.out.printf("arr[%d] = %d\n", i , arr[i] );
        }
    }

4、注意

这样的数组队列是不可逆的,当front在数组的末尾时,这个数组队列就不可用了,因为front 和 rear 不能循环到数组的前面去,所以这样的数组队列是非常局限的。而链表队列,就是队列是由单链表形成的,就没有数组大小的限制,可以无限的入队列和出队列,单链表的操作非常的简单,后续的文章会介绍。那么数组队列是否也可以无限入队列和出队列呢?当然可以,那么怎么可以实现呢?数组队列的局限在哪里?不就是front 和 rear 的指向不能回过头来指向数组的空位置。

只要解决了front 和 rear 能够返回到数组的空位置,是不是就能解决这个局限性的问题呢,因为出队列和入队列都是通过 front 和 rear 操作的。

三、数组模拟环形队列

1、初始化

数组的最大容量实际要少一个,因为我们要预留一个空位置,也就是任何时候数组要多一个空位置,便于我们循环。

class CircleTest{
    private int maxSize;//最大容量
    private int start;//表示队列的头
    private int end;//表示队列的尾的下一个,要预留一个空位
    private int[] arr;//数组用来存放数据
    public CircleTest(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //start和end默认初始化为0,所以不需要写
    }
}

2、判断方法

判断队列是否为空

start是指向队列的头,end是指向队列的尾的下一个,当start和end重合时,队列为空。

public boolean isEmpty(){
        return start == end;
    }

判断队列是否满

因为此时的数组队列可以循环,所以判断是否满的方法要用算法,让队列尾位置下标加一对总容量取余即可,然后判断是否等于start,比如:end = 2 ,start = 3

计算 (end + 1)% maxSize = (2 + 1)% 4 = 3 ,计算结果等于start ,所以是满状态,因为前面说了要预留一个位置,所以容量为4,实际存放数据为3个。

public boolean isFull(){
        return (end + 1) % maxSize == start;;
    }

计算数组中的有效数据

计算有效数据我们要用到一种取余的算法,算法式: (end + maxSize - start) % maxSize ,用队列头加上总容量减去队列尾再对总容量取余。比如:end = 0 ,start = 3

时,有效数据为 (1 + 4 - 3)% 4 = 2,所以有效数据为2个。

public int size(){
        return (end + maxSize - start) % maxSize;
    }

3、增删改查的方法

向队列中添加数据,入队列

首先判断队列是否满,然后因为我们早已预留了一个位置(end指向的位置是空的),所以加入的数据位置可以直接加入到队列(arr[end] = n);环形队列是要无限循环下去的,所以在加入数据后,end 的指向不能直接加一,而要用算法计算end的下一个位置,此算法为:(end + 1) % maxSize

比如:start = 2,end = 3 ,此时添加一个数据 end 的位置移动到在哪里?

根据算法(end + 1) % maxSize = (3 + 1) % 4 = 0 ,所以 end 指向数组下标为0 的位置。如此,就形成了循环。

    public void aDDData(int n){
        //先判断是否满
        if (isFull()){
            System.out.println("数据已满,无法添加");
            return;
        }
        //当前end的位置,加入元素
        arr[end] = n;
        //end指向下一个位置为(end + 1) % maxSize
        end = (end + 1) % maxSize;
    }

删除队列中数据,出队列

首先判断是否为空,然后将要出队列的数据用一个中间变量暂存起来,然后将start 移动,移动到的位置和上面end 的移动方式相同,也是用取余算法:(start + 1) % maxSize 即可。

    public int removeData(){
        //判断是否为空
        if(isEmpty()){
            throw new RuntimeException("数据为空,不能移除");
        }
        //先将数据暂存
        int temp = arr[start];
        //然后将start往后移到(start + 1) % maxSize的位置
        start = (start + 1) % maxSize;
        return temp;
    }

显示队列中所有数据

因为是循环队列,所以位置是无限变化的,所以每次for循环的开始位置为start 所在的位置,要循环的次数取决于数组中的有效数据的个数,及前面我们写的有效个数的算法拿来直接用( start + size() ),取余的方式 :i % maxSize ,可以时时确定数组数据的下标。

    public void showData(){
        //判断是否为空
        if(isEmpty()){
            System.out.println("数据为空,不能显示");
            return;
        }
        for (int i = start; i < start + size() ; i++) {
            System.out.printf("arr[%d] = %d\n", i % maxSize,arr[i % maxSize]);
        }
    }

注意:

循环的关键点在于 start 和 end 指向的下一个位置的确定,队列头和尾的位置可以回过头来,那么就能实现循环,而位置的确定,需要用到取余这个算法,前面的列子可以看出,指向发生变化时都是用的取余算法来确定位置,这个是数组中常见的一种算法,可以记住。

到此这篇关于Java数组队列及环形数组队列超详细讲解的文章就介绍到这了,更多相关Java数组队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java数组队列及环形数组队列超详细讲解

本文链接: https://www.lsjlt.com/news/168361.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java数组队列及环形数组队列超详细讲解
    目录一、队列1、基本介绍2、示意图3、队列的特点二、数组模拟队列1、数组队列初始化2、判断方法3、增删改查的方法4、注意三、数组模拟环形队列1、初始化2、判断方法3、增删改查的方法一...
    99+
    2022-11-13
  • Java队列篇之实现数组模拟队列及可复用环形队列详解
    队列简介 队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据,先取出,后存入的后取出。 示意图:(使用数组模拟队列示意图) 有两个分别指向头部...
    99+
    2022-11-12
  • Java栈与队列超详细分析讲解
    目录一、栈(Stack)1、什么是栈?2、栈的常见方法3、自己实现一个栈(底层用一个数组实现)二、队列(Queue)1、什么是队列?2、队列的常见方法3、队列的实现(单链表实现)4、...
    99+
    2022-11-13
  • java中使用数组实现环形队列
    思路分析: front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素front 的初始值 = 0 rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后...
    99+
    2017-12-30
    java教程 java 数组 实现 环形队列
  • C语言超详细讲解队列的实现及代码
    目录前言队列的概念队列的结构队列的应用场景队列的实现创建队列结构队列初始化  队列销毁  入队列  出队列  队列判空  获取队列元...
    99+
    2022-11-13
  • 数据结构:栈和队列(详细讲解)
    🎇🎇🎇作者: @小鱼不会骑车 🎆🎆🎆专栏: 《数据结构》 🎓🎓...
    99+
    2023-09-14
    数据结构 java 算法
  • Java超详细精讲数据结构之bfs与双端队列
    目录一.bfs二.双端队列三.算法题1.kotori和迷宫2.小红找红点3.小红玩数组一.bfs bfs(广度优先搜索),类似二叉树的层序遍历,利用队列完成。一般用于求最短路。 图的...
    99+
    2022-11-13
  • java中用数组实现环形队列的示例代码
    本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码 一、队列是什么 我们先来看下百科的解释: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,...
    99+
    2022-11-12
  • Java基础之数组模拟循环队列
    目录一、队列简介二、数组模拟队列三、数组模拟循环队列四、代码实现五、运行结果一、队列简介 队列是一个有序列表,遵循“先入先出”的原则,即先存入队列的数据要先取出,后存入的数据后取出。...
    99+
    2022-11-12
  • 怎么在java中利用数组实现一个环形队列
    本篇文章为大家展示了怎么在java中利用数组实现一个环形队列,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系...
    99+
    2023-06-14
  • java数组实现循环队列示例介绍
     从顶部进去数据,从底部出来数据,用数组实现队列,但是下面这个队列,只能进行一次存数值,取数值,不够完善。 import java.util.Scanner; pu...
    99+
    2022-11-12
  • 怎么在Java中利用数组模拟循环队列
    怎么在Java中利用数组模拟循环队列?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、...
    99+
    2023-06-14
  • Java中的循环队列怎么利用数组实现
    这篇文章将为大家详细讲解有关Java中的循环队列怎么利用数组实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用Java的数组实现一下循环队列。队列的类//循环队列class CirQueu...
    99+
    2023-05-31
    循环队列 java
  • java数据结构与算法数组模拟队列示例详解
    目录一、什么是队列二、用数组来模拟队列一、什么是队列 队列是一个有序列表,可以用数组或者链表来实现。遵循先入先出的原则,即:先存入队列的数据,要先取出。后存入的的数据,后取出。 看一...
    99+
    2022-11-13
  • 数组实现Java 自定义Queue队列及应用操作
    数组实现Java 自定义Queue队列及应用 Java 自定义队列Queue: 队列的抽象数据类型就是一个容器,其中的对象排成一个序列,我们只能访问和取出排在最前端( Front)的...
    99+
    2022-11-12
  • 基于Java数组实现循环队列的两种方法小结
    用java实现循环队列的方法:1、添加一个属性size用来记录眼下的元素个数。目的是当head=rear的时候。通过size=0还是size=数组长度。来区分队列为空,或者队列已满。2、数组中仅仅存储数组大小-1个元素,保证rear转一圈之...
    99+
    2023-05-30
    java 数组 循环队列
  • C语言数据结构不挂科指南之栈&队列&数组详解
    目录学习目标栈基本概念栈的基本运算栈的顺序实现双栈栈的链接实现考试要点小结学习目标 自考重点、期末考试必过指南,这篇文章让你理解什么是栈、什么是队列、什么是数组 掌握栈、队列的顺序存...
    99+
    2022-11-13
  • Java数据结构与算法之稀疏数组与队列深入理解
    目录一、数据结构和算法简介二、稀疏数组稀疏数组的应用实例二维数组与稀疏数组的转换二维数组 转 稀疏数组的思路稀疏数组 转 原始的二维数组的思路三、队列数组模拟队列代码优化:数组模拟环...
    99+
    2022-11-12
  • C++线性表深度解析之动态数组与单链表和栈及队列的实现
    目录一、线性表介绍线性表性质二、动态数组1)分析与设计2)实现三、单链表(企业设计方式)1)分析与设计2)实现四、栈(受限线性表)1)利用数组实现栈2)利用单链表实现栈3)栈的应用&...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作