广告
返回顶部
首页 > 资讯 > 精选 >Java如何实现循环队列
  • 830
分享到

Java如何实现循环队列

2023-06-22 02:06:54 830人浏览 薄情痞子
摘要

小编给大家分享一下Java如何实现循环队列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!循环队列循环队列 (Circular Queue) 是一种特殊的队列. 循环队列解决了队列出队时需要将所有数据前移一位 (复杂度为 O

小编给大家分享一下Java如何实现循环队列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

    循环队列

    循环队列 (Circular Queue) 是一种特殊的队列. 循环队列解决了队列出队时需要将所有数据前移一位 (复杂度为 O(n)) 的问题.

    Java如何实现循环队列

    循环队列的底层依然是数组, 不过增加了指向头和尾的指针.

    循环队列实现

    1. 判断队列是否为空: 当头指针 Q.front == 尾指针 Q.rear, 队列为空

    2. 判断队列是否为满: 当头指针 Q.front == 尾指针 Q.rear + 1) % Maxsize, 队列为满

    改变队列大小

    // 改变队列大小private void resize(int capacity) {// 定义新数组    E[] newData = (E[]) new Object[capacity + 1];        // 转移数组元素    for (int i = 0; i < size; i++) {        newData[i] = data[(i +front) % data.length];    }    // 更新    data = newData;    front = 0;    rear = size;}

    enqueue 方法

    // 入队public void enqueue(E e) {    // 判断是否为满    if((rear + 1) % data.length == front) {        resize(getCapacity() * 2);    }    // 队伍加入    data[rear] = e;    rear = (rear + 1) % data.length;    size++;}

    dequeue 方法

    // 出队public E dequeue() {    // 判断是否为空    if(isEmpty()) {        throw new RuntimeException("队列为空");    }    // 取出第一个元素    E element = data[front];    data[front] = null;    // 移动头指针    front = (front + 1) % data.length;    // 数组大小-1    size--;    // 判断是否需要缩小    if(size==getCapacity() / 4 && getCapacity() / 2 != 0) {        resize(getCapacity() / 2);    }    return element;}

    main

    // 主函数public static void main(String[] args) {    // 创建循环队列    CircularQueue<Integer> queue = new CircularQueue<>(5);    // 入队    for (int i = 0; i < 8; i++) {        queue.enqueue(i);        System.out.println(queue);    }    // 出队    for (int i = 0; i < 8; i++) {        queue.dequeue();        System.out.println(queue);    }}

    输出结果:

    CircularQueue{data=[0, null, null, null, null, null], front=0, rear=1, size=1}

    CircularQueue{data=[0, 1, null, null, null, null], front=0, rear=2, size=2}

    CircularQueue{data=[0, 1, 2, null, null, null], front=0, rear=3, size=3}

    CircularQueue{data=[0, 1, 2, 3, null, null], front=0, rear=4, size=4}

    CircularQueue{data=[0, 1, 2, 3, 4, null], front=0, rear=5, size=5}

    CircularQueue{data=[0, 1, 2, 3, 4, 5, null, null, null, null, null], front=0, rear=6, size=6}

    CircularQueue{data=[0, 1, 2, 3, 4, 5, 6, null, null, null, null], front=0, rear=7, size=7}

    CircularQueue{data=[0, 1, 2, 3, 4, 5, 6, 7, null, null, null], front=0, rear=8, size=8}

    CircularQueue{data=[null, 1, 2, 3, 4, 5, 6, 7, null, null, null], front=1, rear=8, size=7}

    CircularQueue{data=[null, null, 2, 3, 4, 5, 6, 7, null, null, null], front=2, rear=8, size=6}

    CircularQueue{data=[null, null, null, 3, 4, 5, 6, 7, null, null, null], front=3, rear=8, size=5}

    CircularQueue{data=[null, null, null, null, 4, 5, 6, 7, null, null, null], front=4, rear=8, size=4}

    CircularQueue{data=[null, null, null, null, null, 5, 6, 7, null, null, null], front=5, rear=8, size=3}

    CircularQueue{data=[6, 7, null, null, null, null], front=0, rear=2, size=2}

    CircularQueue{data=[7, null, null], front=0, rear=1, size=1}

    CircularQueue{data=[null, null], front=0, rear=0, size=0}

    完整代码 

    import java.util.ArrayList;import java.util.Arrays;public class CircularQueue<E> {    private E[] data;    private int front, rear;    private int size;    // 无参构造    public CircularQueue() {        this(10);    }    // 有参构造    public CircularQueue(int capacity) {       data = (E[]) new Object[capacity + 1];       front = rear = size = 0;    }    // 入队    public void enqueue(E e) {        // 判断是否为满        if((rear + 1) % data.length == front) {            resize(getCapacity() * 2);        }        // 队伍加入        data[rear] = e;        rear = (rear + 1) % data.length;        size++;    }    // 出队    public E dequeue() {        // 判断是否为空        if(isEmpty()) {            throw new RuntimeException("队列为空");        }        // 取出第一个元素        E element = data[front];        data[front] = null;        // 移动头指针        front = (front + 1) % data.length;        // 数组大小-1        size--;        // 判断是否需要缩小        if(size==getCapacity() / 4 && getCapacity() / 2 != 0) {            resize(getCapacity() / 2);        }        return element;    }    // 获取队列大小    public int getSize() {        return size;    }    // 获取队列容量    public int getCapacity() {        return data.length - 1;    }    // 队列是否为空    public boolean isEmpty() {        return front == rear;    }    // 改变队列大小    private void resize(int capacity) {        // 创建新数组        E[] newData = (E[]) new Object[capacity + 1];        // 转移数组元素        for (int i = 0; i < size; i++) {            newData[i] = data[(i +front) % data.length];        }        // 更新        data = newData;        front = 0;        rear = size;    }    @Override    public String toString() {        return "CircularQueue{" +                "data=" + Arrays.toString(data) +                ", front=" + front +                ", rear=" + rear +                ", size=" + size +                '}';    }    // 主函数    public static void main(String[] args) {        // 创建循环队列        CircularQueue<Integer> queue = new CircularQueue<>(5);        // 入队        for (int i = 0; i < 8; i++) {            queue.enqueue(i);            System.out.println(queue);        }        // 出队        for (int i = 0; i < 8; i++) {            queue.dequeue();            System.out.println(queue);        }    }}

    看完了这篇文章,相信你对“Java如何实现循环队列”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

    --结束END--

    本文标题: Java如何实现循环队列

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

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

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

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

    下载Word文档
    猜你喜欢
    • Java如何实现循环队列
      小编给大家分享一下Java如何实现循环队列,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!循环队列循环队列 (Circular Queue) 是一种特殊的队列. 循环队列解决了队列出队时需要将所有数据前移一位 (复杂度为 O...
      99+
      2023-06-22
    • 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队列实现方法(顺序队列,链式队列,循环队列)
      双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略。ArrayDeque包括顺序栈和顺序队列,LinkedList包含链式栈和链式队列。ArrayDeque和LinkedList都是线程不安全的。Pr...
      99+
      2023-05-30
      java 队列 顺序
    • 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循环队列与非循环队列的区别总结
      非循环循环队列 判满:(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
    • C语言如何实现顺序循环队列
      这篇文章将为大家详细讲解有关C语言如何实现顺序循环队列,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、队列和循环队列基本概念队列:和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另...
      99+
      2023-06-29
    • 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
    • 如何将MongoDB作为循环队列
      这篇文章主要介绍“如何将MongoDB作为循环队列”,在日常操作中,相信很多人在如何将MongoDB作为循环队列问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何将MongoDB作为循环队列”的疑惑有所帮助!...
      99+
      2023-06-14
    • C语言实现顺序循环队列实例
      目录一、队列和循环队列基本概念二、代码实操总结一、队列和循环队列基本概念 队列: 和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另一端删除。 允许插入的叫&...
      99+
      2022-11-13
    • Java数据结构与算法之循环队列的实现
      目录概述循环队列循环队列实现改变队列大小enqueue 方法dequeue 方法main完整代码 概述 从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章...
      99+
      2022-11-12
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作