Java代码实现循环队列的示例代码

循环队列结构

队列特点

  • 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
  • 队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。

循环队列优缺点

循环队列的优点:

  • 可以有效的利用资源。用数组实现队列时,如果不移动,随着数据的不断读写,会出现假满队列的情况。即尾数组已满但头数组还是空的;循环队列也是一种数组,只是它在逻辑上把数组的头和尾相连,形成循环队列,当数组尾满的时候,要判断数组头是否为空,不为空继续存放数据。

循环队列的缺点:

  • 循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,判别队列是"空"是"满"需要特殊处理 —— 判断队列为空的条件还是head == tail,但是判断队列已满的条件则是(tail+1)%size==head。

应用场景

最经典的就是类似于约瑟夫环的问题,可以使用循环队列。

Java代码实现循环队列

// 基于数组实现一个循环链表
public class CircleArrayQueue<T> {

    // 定义数组用于存放数据
    private T[] arr;
    private int head;  // 记录队列头
    private int tail;  // 记录队列尾
    private int size;  // 数组大小
    // 循环链表初始化
    public CircleArrayQueue(int cap){
        this.arr = (T[])new Object[cap];
        this.head = 0;
        this.tail = 0;
        this.size = cap;
    }
    // 入队方法
    public void offer(T data){
        // 判断循环队列是否已满,满了就直接return
        if((tail + 1) % size == head){
            return;
        }
        arr[tail] = data;     // 向尾加入元素
        tail = (tail + 1) % size; // 将尾指针后移1,考虑端点情况处理
    }
    // 出队方法
    public T poll(){
        // 循环队列为空则直接返回null
        if(isEmpty()){
            return null;
        }
        T pollData = arr[head];   // 找到出队元素
        arr[head] = null;         // 清除出队位置的元素
        head = (head + 1) % size; // 将尾指针后移1,考虑端点情况处理
        return pollData;
    }
    // 判断循环队列是否为空
    public boolean isEmpty(){
        return head == tail;
    }
    // 测试
    public static void main(String[] args) {
        CircleArrayQueue<String> arrayQueue = new CircleArrayQueue<>(5);
        arrayQueue.offer("a");
        arrayQueue.offer("b");
        arrayQueue.offer("c");
        arrayQueue.offer("d");
        arrayQueue.offer("e");
        arrayQueue.offer("f");
        System.out.println(arrayQueue);
        String poll1 = arrayQueue.poll();
        System.out.println("出队元素:" + poll1);
        String poll2 = arrayQueue.poll();
        System.out.println("出队元素:" + poll2);
    }
}

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

(0)

相关推荐

  • java中的4种循环方法示例详情

    目录 java循环结构 1.while循环 2.do-while循环 3.for循环 4.java 增强for循环 java循环结构 顺序结构的程序语句只能 被执行一次.如果你要同样的操作执行多次,就需要使用循环结构. java中有三种主要的循环结构: while 循环 do...while 循环 for 循环 在java5中引入一种主要用于数组的增强型for循环. 1.while循环 while是最基本的循环,它的结构为: package com.example.lesson1; //whil

  • JAVA中的for循环几种使用方法讲解

    目录 一般写法 1.遍历数组的传统方式 2.遍历Collection对象的传统方式 第二种写法 3.遍历数组的简单方式 4.遍历Collection的简单方式 防止在循环体里修改循环变量 5.禁止重新赋值 6.允许修改状态 类型相容问题 7.使用和要被遍历的数组中的元素相同类型的循环变量 8.使用和要被遍历的Collection中的元素相同类型的循环变量 9.使用要被遍历的对象中的元素的上级类型的循环变量 10.使用能和要被遍历的对象中的元素的类型自动转换的类型的循环变量 一般写法 1.遍历数组

  • Java代码实现循环队列的示例代码

    循环队列结构 队列特点 队列为一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 队列的数据元素又称为队列元素.在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队.因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO-first i

  • 利用Java手写阻塞队列的示例代码

    目录 前言 需求分析 阻塞队列实现原理 线程阻塞和唤醒 数组循环使用 代码实现 成员变量定义 构造函数 put函数 offer函数 add函数 take函数 重写toString函数 完整代码 总结 前言 在我们平时编程的时候一个很重要的工具就是容器,在本篇文章当中主要给大家介绍阻塞队列的原理,并且在了解原理之后自己动手实现一个低配版的阻塞队列. 需求分析 在前面的两篇文章ArrayDeque(JDK双端队列)源码深度剖析和深入剖析(JDK)ArrayQueue源码当中我们仔细介绍了队列的原理,

  • Java Kafka实现延迟队列的示例代码

    目录 基于kafka如何实现延迟队列 完善细节 Java代码实现 还需要做什么 kafka作为一个使用广泛的消息队列,很多人都不会陌生,但当你在网上搜索“kafka 延迟队列”,出现的都是一些讲解时间轮或者只是提供了一些思路,并没有一份真实可用的代码实现,今天我们就来打破这个现象,提供一份可运行的代码,抛砖引玉,吸引更多的大神来分享. 基于kafka如何实现延迟队列 想要解决一个问题,我们需要先分解问题.kafka作为一个高性能的消息队列,只要消费能力足够,发出的消息都是会立刻收到的,因此我们需

  • Java利用Redis实现消息队列的示例代码

    本文介绍了Java利用Redis实现消息队列的示例代码,分享给大家,具体如下: 应用场景 为什么要用redis? 二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成java对象; 主要是用到了ByteArrayOutputStream和ByteArrayInputStream; 注意:每个需要序列化的对象都要实现Serializable接口; 其代码如下: package Utils

  • java中用数组实现环形队列的示例代码

    本篇文章主要讲述了使用数组实现环形队列的思路以及具体代码 一.队列是什么 我们先来看下百科的解释: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头. 总结起来两点: 1.一种线性表 2.添加操作只能在表尾,删除操作在表头(先进先出) 二.实现队列的思路 1.初始化一个空队列 初始化一个大小固定的数组,并将头指针,尾指针都指向下表为0的位置,但其

  • Java数据结构之循环队列简单定义与用法示例

    本文实例讲述了Java数据结构之循环队列简单定义与用法.分享给大家供大家参考,具体如下: 一.概述: 1.原理: 与普通队列的区别在于循环队列添加数据时,如果其有效数据end == maxSize - 1(最大空间)的话,end指针又移动到-1的位置 删除数据时,如果head== maxSize时 head指针移动到0的位置 2.示例图: 二.实现代码: package com.java.queue; /** * @描述 对列 * @项目名称 Java_DataStruct * @包名 com.

  • java导出json格式文件的示例代码

    本文介绍了java导出json格式文件的示例代码,分享给大家,具体如下: 生成json文件代码: import java.io.File; import java.io.FileWriter; import java.io.Writer; public class CreateFileUtil { /** * 生成.json格式文件 */ public static boolean createJsonFile(String jsonString, String filePath, String

  • java poi导出图片到excel示例代码

    本文实例为大家分享了java使用poi导出图片到Excel的具体代码,供大家参考,具体内容如下 代码实现 Controller /** * 导出志愿者/人才数据 * @param talent_type * @return */ @RequestMapping("/exportData") public void exportData(Integer talent_type, HttpServletResponse response) { String fileId = UUID.ra

  • JAVA实现DOC转PDF的示例代码

    目录 一.下载依赖 二.代码实现 三.转换结果 四.后续研究 五.总结 Word作为目前主流的文本编辑软件之一,功能十分强大,应用人群广,但是它也存在一些问题.像是Word文件在不同软件或操作平台之间传输的时候,时不时会出现各种格式的"变化",也会有点"不稳定",例如内容和格式经常容易篡动. 相较于Word,pdf格式文件显然优秀不少.虽然在内容编辑和修改方面表现不佳,但pdf格式文件在不同平台和软件上的稳定性表现着实出色.日常办公中,越来越多的会选择将编辑好的Wo

  • Java实现萝卜勇者游戏的示例代码

    目录 前言 主要设计 功能截图 代码实现 启动类 键盘监听 核心算法 总结 前言 <萝卜勇者>是由国内玩家自制的一款独立游戏,玩家扮演萝卜勇士闯关,打败各种邪恶的敌人,获得最后的胜利. <萝卜勇者>游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 参考<萝卜勇者>的剧情,实现JAVA版本的单机游戏. 主要设计 1. 用Swing库做可视化界面 2.键盘监听,用WSAD可以控制光标移动,J是确定,K是取消,游戏中,WSA

随机推荐