广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java 循环队列/环形队列的实现流程
  • 363
分享到

Java 循环队列/环形队列的实现流程

2024-04-02 19:04:59 363人浏览 独家记忆

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

摘要

之前,我们使用链表实现了基础队列,链接放在这里可以去康康哟 Java栈和基础队列的实现详解 之所以没有选择数组来实现,是因为每有一个元素出队,数组中所有剩下的元素都需要向前移动一次,

之前,我们使用链表实现了基础队列,链接放在这里可以去康康哟

Java栈和基础队列的实现详解

之所以没有选择数组来实现,是因为每有一个元素出队,数组中所有剩下的元素都需要向前移动一次,因此没有链表高效。

此时,我们就引出了循环队列的概念。

循环队列,又称环形队列,逻辑上是一个环,物理上依然是线性表。

head-指向队列的第一个元素

tail-指向队列最后一个元素的下一个位置

当tail走到数组末尾时,下一步再次返回数组头部(从0开始)

出队之后的元素就访问不到了,此时逻辑上已经将它删除了,tail向后走到该位置时覆盖它即可。此时就解决了数组队列需要一直搬运元素的问题。

了解循环队列的概念之后,我们就能明白它的几个基础知识:

当head == tail 时,表示队列为空

根据上面 head 和 tail 的定义,队列已满时,tail 指向最后一个元素的下一个位置,也就是head ,此时我们就无法区分环形队列到底是已满还是为空。所以我们在环形队列的数组中浪费一个空间,在区分数组是否已满,如下图,就是一个已满的队列

那么如何移动 tail 指针使他返回数组头部呢?我们运用取模操作:

tail = ( tail + 1 ) % 数组.length; 

根据上式我们就能判断队列是否已满的方法:

( tail + 1 ) % 数组.length == head; 

此时 head 和 tail 引用向后移动时,不能简单的 +1,要 ++ 之后对数组长度取模,这样就可以返回数组头部继续向后移动:

 head = ( head +1 ) % 数组.length;

tail = ( tail +1 ) % 数组.length;

那么如何获取当前队列最后一个元素的索引呢?

图①中最后一个元素的索引就是 tail -1

图②的tail恰好在数组第一个位置,这时最后一个元素下标就是 数组.length -1

综上:数组最后一个元素的索引lastIndex

lastIndex = tail == 0 ? 数组.length -1 : tail -1;

代码实现:


public interface Queue<E> {
    void offer(E val);//入队
    E poll();//出队,返回出队的值
    E peek();//返回队首元素
    boolean isEmpty();//判断是否为空
}
 
 
import java.util.NoSuchElementException;
 
//基于整型的循环队列
public class LoopQueue implements Queue<Integer>{
    private Integer[] data;
    private int head;//队首元素
    private int tail;//队尾元素的下一个位置
    private int size;//当前元素个数
    public LoopQueue(int n){
        //n为希望保存的元素个数
        //在循环队列中要浪费一个元素空间,来判断是否已满,所以 +1
        data = new Integer[n + 1];
        }
 
    @Override
    //添加元素
    public void offer(Integer val) {
        if(isFull()){
            throw new ArrayIndexOutOfBoundsException("queue is full, cannot offer new val");
        }
        data[tail] = val;
        //tail向后移
        tail = (tail + 1) % data.length;
        size++;
    }
 
    @Override
    //出队
    public Integer poll() {
        if (isEmpty()){
            throw new NoSuchElementException("queues empty!cannot poll");
        }
        Integer val = data[head];
        //head向后移动
        head = (head + 1) % data.length;
        size--;
        return val;
    }
 
    @Override
    public Integer peek() {
        if (isEmpty()){
            throw new NoSuchElementException("queues empty!cannot poll");
        }
        return data[head];
    }
 
    @Override
    //判断是否为空
    public boolean isEmpty() {
        return tail == head;
    }
    public String toString(){
        StringBuilder sb = new StringBuilder();
        sb.append("front[");
        //取得最后一个元素的下标
        int lastIndex = tail == 0 ? data.length-1 : tail-1;
        for (int i = head; i != tail; ) {
            sb.append(data[i]);
            if (i != lastIndex){
                sb.append(",");
            }
            i = (i+1) % data.length;
 
        }
        sb.append("]tail");
        return sb.toString();
    }
    //判断队列是否已满
    public boolean isFull(){
        return (tail + 1) % data.length == head;
    }
}

//代码测试
public class LoopQueueTest {
    public static void main(String[] args) {
        Queue<Integer> loopQueue = new LoopQueue(5);
        for (int i = 0; i < 5; i++) {
            loopQueue.offer(i+1);
        }
        System.out.println(loopQueue);
//        loopQueue.offer(1);
        System.out.println(loopQueue.poll());
        System.out.println(loopQueue);
    }
}

运行结果:

到此这篇关于Java 循环队列/环形队列的实现流程的文章就介绍到这了,更多相关Java 循环队列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java 循环队列/环形队列的实现流程

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

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

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

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

下载Word文档
猜你喜欢
  • Java 循环队列/环形队列的实现流程
    之前,我们使用链表实现了基础队列,链接放在这里可以去康康哟 Java栈和基础队列的实现详解 之所以没有选择数组来实现,是因为每有一个元素出队,数组中所有剩下的元素都需要向前移动一次,...
    99+
    2022-11-13
  • java实现循环队列
    循环队列的优点普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)。循环队列的逻辑:当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,...
    99+
    2017-09-10
    java入门 java 循环队列
  • java队列实现方法(顺序队列,链式队列,循环队列)
    双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略。ArrayDeque包括顺序栈和顺序队列,LinkedList包含链式栈和链式队列。ArrayDeque和LinkedList都是线程不安全的。Pr...
    99+
    2023-05-30
    java 队列 顺序
  • Java循环队列与非循环队列的区别总结
    非循环循环队列 判满:(rear+1) % maxsize == front 判空:front == rear 队列元素个数:rear = (rear + ...
    99+
    2022-11-12
  • Java 单向队列及环形队列的实现原理
    目录队列的特点图解实现过程:优化解决——环形队列实现思路环形队列各步骤及各方法实现讲解最后:队列的特点 1.可以使用数组和链表两种方式来实现。 2.遵循先入先出(FIFO)的规则,即...
    99+
    2022-11-12
  • JAVA怎么实现循环队列
    在Java中,可以使用数组和指针来实现循环队列。以下是一个简单的循环队列的实现示例:```javapublic class Circ...
    99+
    2023-09-23
    JAVA
  • Java如何实现循环队列
    小编给大家分享一下Java如何实现循环队列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!循环队列循环队列 (Circular Queue) 是一种特殊的队列. 循环队列解决了队列出队时需要将所有数据前移一位 (复杂度为 O...
    99+
    2023-06-22
  • Java单向队列及环形队列的实现原理是什么
    这篇文章主要介绍“Java单向队列及环形队列的实现原理是什么”,在日常操作中,相信很多人在Java单向队列及环形队列的实现原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java单向队列及环形队列的实...
    99+
    2023-06-25
  • Java动态循环队列怎么实现
    这篇文章将为大家详细讲解有关Java动态循环队列怎么实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列1.1 定义队列 (Queue) 是一种限定性的有序线性表,它只允许在表的一端插入元素,而在另...
    99+
    2023-06-15
  • Java队列篇之实现数组模拟队列及可复用环形队列详解
    队列简介 队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据,先取出,后存入的后取出。 示意图:(使用数组模拟队列示意图) 有两个分别指向头部...
    99+
    2022-11-12
  • C语言链式队列与循环队列怎么实现
    这篇文章主要介绍了C语言链式队列与循环队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言链式队列与循环队列怎么实现文章都会有所收获,下面我们一起来看看吧。队列的实现队列是一种先进先出(First ...
    99+
    2023-06-30
  • C语言详解链式队列与循环队列的实现
    目录队列的实现链式队列链式队列的定义链式队列的实现循环队列循环队列的定义循环队列的实现队列的实现 队列是一种先进先出(First in First Out)的线性表,简称FIFO。与...
    99+
    2022-11-13
  • java中使用数组实现环形队列
    思路分析: front 变量的含义做一个调整: front 就指向队列的第一个元素, 也就是说 arr[front] 就是队列的第一个元素front 的初始值 = 0 rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后...
    99+
    2017-12-30
    java教程 java 数组 实现 环形队列
  • java数据结构基础:顺序队列和循环队列
    目录队列:顺序队列:代码实现:循环队列:代码实现:总结队列: 队列是一种受限制的线性表 只允许在表的一端进行插入,另一端进行删除 插入的一端称作队尾,删除的一端称作队头 具有先进先出...
    99+
    2022-11-12
  • Java动态循环队列是如何实现的
    目录一、队列1.1 定义1.2 抽象数据类型1.3 顺序存储二、数组队列2.1 思路分析2.2 代码实现2.3 数组队列实现2.4 分析三、环形队列3.1 思路分析3.2 代码实现3...
    99+
    2022-11-12
  • java数组实现循环队列示例介绍
     从顶部进去数据,从底部出来数据,用数组实现队列,但是下面这个队列,只能进行一次存数值,取数值,不够完善。 import java.util.Scanner; pu...
    99+
    2022-11-12
  • Java数组队列及环形数组队列超详细讲解
    目录一、队列1、基本介绍2、示意图3、队列的特点二、数组模拟队列1、数组队列初始化2、判断方法3、增删改查的方法4、注意三、数组模拟环形队列1、初始化2、判断方法3、增删改查的方法一...
    99+
    2022-11-13
  • C语言循环队列与用队列实现栈问题解析
    目录循环队列题目描述题目链接思路分析代码实现用队列实现栈题目描述题目链接思路分析代码实现循环队列 循环队列: 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并...
    99+
    2022-11-13
  • Java代码实现循环队列的示例代码
    循环队列结构 队列特点 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受...
    99+
    2022-11-12
  • Java中的循环队列怎么利用数组实现
    这篇文章将为大家详细讲解有关Java中的循环队列怎么利用数组实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用Java的数组实现一下循环队列。队列的类//循环队列class CirQueu...
    99+
    2023-05-31
    循环队列 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作