广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java实现循环队列
  • 515
分享到

java实现循环队列

java入门java循环队列 2017-09-10 10:09:28 515人浏览 无得
摘要

循环队列的优点普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)。循环队列的逻辑:当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,

循环队列的优点

普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)。

循环队列的逻辑:

当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,入队的元素将会放在tail的位置上,随后执行tail++操作;出队时front位置上的元素将会置null,随后执行front++操作;此时仍能保持着tail位置在front后面的状态,如下图所示:

6.jpg

当元素继续添加,最后一个元素将放到索引为7的位置,此时tail位置将会移动到队首前面索引为0的位置上,此时tail在数组的索引为变为:(tail+ 1 )% capacity如下图所示:

348c6d5fe9956124864a9d0fbb1fe58.png

当元素继续添加时,元素将会在tail位置上添加,tail继续往后移动,如下图所示:

c7a2b183ecf37fafb85ce9778056f02.png

继续添加元素,当tail与front还相距一个单位时,即此时数组还有一个空余存储空间,但当前数组已经不能继续实现循环队列的插入操作了,因为循环队列判断队列为空的条件就是front == tail,所以此时需要进行扩容操作;因此此处有意识的浪费了一个空间。

此处可以推出,循环队列元素满的条件为:tail +1 == front(初步得出,后续会完善为(tail + 1) % capacity == front )

适当情况下,此若时持续进行出队操作,front的位置也将会从数组最右端跳转到数组最左端开始。此时front在数组的索引为变为:(front + 1 )% capacity

代码实现:(相关视频教程分享:java视频教程)

package dataStructure.chapter3;


public class LoopQueue implements Queue {

    private E[] data;
    private int front,tail;
    private int size;

    public LoopQueue(int capacity){
        data = (E[]) new Object[capacity+1];
    }

    public LoopQueue(){
        this(10);
    }

    public int getCapacity(){
        return data.length-1;
    }

    
    @Override
    public void enqueue(E e) {
        //循环队列元素满的判断条件,如果满了就进行扩容操作,扩大两倍
        if ((tail+1)%data.length == front)
            resize(2 * getCapacity());
        data[tail] = e;
        tail = (tail + 1) % data.length;
        size ++;

    }

    
    private void resize(int newCapacity){
        E[] newData = (E[]) new Object[newCapacity+1];
        //循环队列第一种遍历方式
        for (int i = 0 ; i < size ; i++ ){
//newData[]中的元素与data[]中的元素,一方面存在着front的偏移量,另一方面,data[]中的元素,
//可能在有部分处于front前面,因此此处采用对数组长度取余,来判断元素的位置
            newData[i] = data[(i+front)%data.length];
        }
        data = newData;
        front =0;
        tail = size;

    }

    @Override
    public E dequeue() {
        //首先判断队列是否为空,如果为空则抛出异常
        if (isEmpty())
            throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
        E ret = data[front];
        //引用地址需要置空,否则JVM不能及时回收空间,从而可能会出现OOM异常
        data[front] = null;
        front = (front + 1 )% data.length;
        size--;
        //如果元素数量达到队列容积的1/4,且队列容积/2 不等于0时,进行缩容操作
        if (size == getCapacity() / 4 && getCapacity() / 2 != 0 )
            resize(getCapacity() / 2);
        return ret;
    }

    
    @Override
    public E getFront() {
        if (isEmpty())
            throw new IllegalArgumentException("Queue is empty.");
        return data[front];
    }

    @Override
    public int getSize() {
        return size;
    }

    
    @Override
    public boolean isEmpty() {
        return front == tail;
    }

    @Override
    public String toString(){
        StringBuilder res = new StringBuilder();
        res.append(String.fORMat("Queue: size = %d, capacity = %d
",size, getCapacity()));
        res.append("front[");
        //循环队列遍历的第二种方法
        for (int i = front; i != tail; i = (i + 1) % data.length){
            res.append(data[i]);
            //循环队列未遍历到队尾的标志
            if ((i + 1) % data.length != tail)
                res.append(", ");
        }
        res.append("] tail");
        return res.toString();
    }
}

相关文章教程推荐:java入门教程

--结束END--

本文标题: java实现循环队列

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

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

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

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

下载Word文档
猜你喜欢
  • java实现循环队列
    循环队列的优点普通队列出队操作开销大:在出队操作时,索引为0后面的所有元素,都需要往前移动一位,元素越多,消耗的时间也越多,时间复杂度为O(N)。循环队列的逻辑:当元素较少时(tail位置在front后面),循环队列与普通队列出队操作一样,...
    99+
    2017-09-10
    java入门 java 循环队列
  • Java 循环队列/环形队列的实现流程
    之前,我们使用链表实现了基础队列,链接放在这里可以去康康哟 Java栈和基础队列的实现详解 之所以没有选择数组来实现,是因为每有一个元素出队,数组中所有剩下的元素都需要向前移动一次,...
    99+
    2022-11-13
  • JAVA怎么实现循环队列
    在Java中,可以使用数组和指针来实现循环队列。以下是一个简单的循环队列的实现示例:```javapublic class Circ...
    99+
    2023-09-23
    JAVA
  • Java如何实现循环队列
    小编给大家分享一下Java如何实现循环队列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!循环队列循环队列 (Circular Queue) 是一种特殊的队列. 循环队列解决了队列出队时需要将所有数据前移一位 (复杂度为 O...
    99+
    2023-06-22
  • 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动态循环队列怎么实现
    这篇文章将为大家详细讲解有关Java动态循环队列怎么实现,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列1.1 定义队列 (Queue) 是一种限定性的有序线性表,它只允许在表的一端插入元素,而在另...
    99+
    2023-06-15
  • java数组实现循环队列示例介绍
     从顶部进去数据,从底部出来数据,用数组实现队列,但是下面这个队列,只能进行一次存数值,取数值,不够完善。 import java.util.Scanner; pu...
    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代码实现循环队列的示例代码
    循环队列结构 队列特点 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受...
    99+
    2022-11-12
  • C语言链式队列与循环队列怎么实现
    这篇文章主要介绍了C语言链式队列与循环队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言链式队列与循环队列怎么实现文章都会有所收获,下面我们一起来看看吧。队列的实现队列是一种先进先出(First ...
    99+
    2023-06-30
  • C语言详解链式队列与循环队列的实现
    目录队列的实现链式队列链式队列的定义链式队列的实现循环队列循环队列的定义循环队列的实现队列的实现 队列是一种先进先出(First in First Out)的线性表,简称FIFO。与...
    99+
    2022-11-13
  • Java中的循环队列怎么利用数组实现
    这篇文章将为大家详细讲解有关Java中的循环队列怎么利用数组实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用Java的数组实现一下循环队列。队列的类//循环队列class CirQueu...
    99+
    2023-05-31
    循环队列 java
  • java数据结构基础:顺序队列和循环队列
    目录队列:顺序队列:代码实现:循环队列:代码实现:总结队列: 队列是一种受限制的线性表 只允许在表的一端进行插入,另一端进行删除 插入的一端称作队尾,删除的一端称作队头 具有先进先出...
    99+
    2022-11-12
  • C语言循环队列与用队列实现栈问题解析
    目录循环队列题目描述题目链接思路分析代码实现用队列实现栈题目描述题目链接思路分析代码实现循环队列 循环队列: 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并...
    99+
    2022-11-13
  • 数据结构之——Python实现循环队列
    栈是先入后出,与之相反的是队列,队列是先进先出的线性结构。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。 图1 队列的定义 队列的存储结构中使用的最多的是循...
    99+
    2023-01-31
    数据结构 队列 Python
  • C语言实现顺序循环队列实例
    目录一、队列和循环队列基本概念二、代码实操总结一、队列和循环队列基本概念 队列: 和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另一端删除。 允许插入的叫&...
    99+
    2022-11-13
  • Java数据结构与算法之循环队列的实现
    目录概述循环队列循环队列实现改变队列大小enqueue 方法dequeue 方法main完整代码 概述 从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章...
    99+
    2022-11-12
  • Java 单向队列及环形队列的实现原理
    目录队列的特点图解实现过程:优化解决——环形队列实现思路环形队列各步骤及各方法实现讲解最后:队列的特点 1.可以使用数组和链表两种方式来实现。 2.遵循先入先出(FIFO)的规则,即...
    99+
    2022-11-12
  • C语言如何实现顺序循环队列
    这篇文章将为大家详细讲解有关C语言如何实现顺序循环队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列和循环队列基本概念队列:和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作