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

循环队列(也称为环形队列)是一种在队列的头部和尾部可以相互转换的队列。它可以避免由于队列尾部占满而导致队列无法继续添加元素的问题。Java 中可以通过数组来实现循环队列,以下是实现流程:

1. 定义一个数组和两个指针

先定义一个数组来存储队列中的元素。定义两个指针,分别指向队列头和队列尾。

public class CircularQueue {
    private int[] data;
    private int head;
    private int tail;
    private int size;

    public CircularQueue(int k) {
        data = new int[k];
        head = -1;
        tail = -1;
        size = k;
    }
}

2. 判断队列是否为空或满

  • 队列为空:如果队列头和尾指针指向同一个位置,表示队列为空。
  • 队列满:如果队列尾指针 + 1 坐标与队列头指针相同时,表示队列已满。
public boolean isEmpty() {
    return head == -1 && tail == -1;
}

public boolean isFull() {
    return (tail + 1) % size == head;
}

3. 入队操作

在入队操作之前,需要先判断队列是否已满。如果队列已满,则无法再插入新元素。

public boolean enQueue(int value) {
    if (isFull()) {
        return false;
    }
    if (isEmpty()) {
        head = 0;
    }
    tail = (tail + 1) % size;
    data[tail] = value;
    return true;
}

4. 出队操作

在出队操作之前,需要先判断队列是否为空。如果队列为空,无法进行出队操作。队列不为空时,先将头指针指向下一个位置,并返回原头指针位置存储的元素。

public int deQueue() {
    if (isEmpty()) {
        return -1;
    }
    int value = data[head];
    if (head == tail) {
        head = -1;
        tail = -1;
    } else {
        head = (head + 1) % size;
    }
    return value;
}

示例1

CircularQueue queue = new CircularQueue(3);
queue.enQueue(1); // 队列为 [1]
queue.enQueue(2); // 队列为 [1, 2]
queue.enQueue(3); // 队列为 [1, 2, 3]
queue.enQueue(4); // 返回 false,队列已满
queue.deQueue();  // 返回 1,队列为 [2, 3]
queue.deQueue();  // 返回 2,队列为 [3]
queue.deQueue();  // 返回 3,队列为空
queue.deQueue();  // 返回 -1,队列为空,无法出队

示例2

CircularQueue queue2 = new CircularQueue(5);
queue2.enQueue(2); // 队列为 [2]
queue2.enQueue(5); // 队列为 [2, 5]
queue2.enQueue(9); // 队列为 [2, 5, 9]
queue2.enQueue(1); // 队列为 [2, 5, 9, 1]
queue2.deQueue();  // 返回 2,队列为 [5, 9, 1]
queue2.deQueue();  // 返回 5,队列为 [9, 1]
queue2.deQueue();  // 返回 9,队列为 [1]
queue2.enQueue(3); // 队列为 [1, 3]
queue2.enQueue(6); // 队列为 [1, 3, 6]
queue2.deQueue();  // 返回 1,队列为 [3, 6]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 循环队列/环形队列的实现流程 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 详解Spring 中 Bean 对象的存储和取出

    下面是详解Spring中Bean对象的存储和取出的完整攻略: 目录 1. Spring中Bean对象的存储 1.1 BeanFactory 1.2 ApplicationContext 2. Spring中Bean对象的取出 2.1 通过名称获取Bean对象 2.2 通过类型获取Bean对象 3. 示例说明 3.1 示例1:通过名称获取Bean对象 3.2 …

    Java 2023年5月26日
    00
  • 从零开始学SpringBoot如何开始使用图文详解

    下面是详细讲解“从零开始学SpringBoot如何开始使用图文详解”的完整攻略。 一、概述 要学习SpringBoot,首先需要掌握Java编程语言、Spring框架和相关Web开发知识。本攻略提供了一个逐步学习SpringBoot框架的过程,通过实践示例项目,让大家逐步掌握SpringBoot的基础和使用。 二、准备工作 在开始学习之前,我们需要先准备好J…

    Java 2023年5月15日
    00
  • 5分钟快速上手Spring Boot

    5分钟快速上手Spring Boot 简介 Spring Boot是一个快速开发框架,可以让开发者快速地创建基于Spring的应用程序。通过集成常用的组件和框架,Spring Boot减少了许多繁琐的配置和集成操作,使得开发者可以专注于业务逻辑的实现。 步骤 步骤一:创建一个Spring Boot项目 在Spring Initializr网站中,配置你的项目…

    Java 2023年6月15日
    00
  • Java深入讲解Object类常用方法的使用

    Java深入讲解Object类常用方法的使用攻略 介绍 在Java中,所有的类都默认继承自Object类,Object类是Java中非常重要的一个类。Object类中拥有很多方法,本攻略主要介绍Object类常用方法的使用。 常用方法列表 下面列举了Object类中的常用方法: equals(Object obj):判断对象是否相等。 toString():…

    Java 2023年5月26日
    00
  • 常见的Java加密算法有哪些?

    常见的Java加密算法有以下几种:对称加密算法、非对称加密算法和散列算法。 对称加密算法 对称加密算法是指发送方和接收方使用相同的密钥对数据进行加密和解密。常见的对称加密算法有DES、3DES、AES、Blowfish等。 以AES算法为例,以下为使用步骤: 1)生成密钥 SecretKey secretKey = KeyGenerator.getInsta…

    Java 2023年5月11日
    00
  • JAVA字符串格式化-String.format()的使用

    下面为您详细讲解”JAVA字符串格式化-String.format()的使用”的完整攻略。 什么是字符串格式化? 在开发过程中,有时候我们需要将不同的数据格式化为字符串,以便我们更好地输出到控制台或文件中。例如,我们需要将日期、时间、数字等各种类型的数据格式化为字符串,然后再进行输出,这时候要用到字符串格式化功能。 Java中的字符串格式化 Java中的字符…

    Java 2023年5月26日
    00
  • Java 按行读取文件按行写入文件并以空格分割字符串的方法

    要实现Java按行读取文件并以空格分割字符串的方法,可以使用以下步骤: 使用Java中的BufferedReader类读取文件中的每一行数据。 将每一行数据使用Java中的String类的split方法按照空格分割成字符串数组。 将分割后的字符串数组转换为每个元素带空格的字符串,并写入到输出文件中。 以下是两个示例: 示例一: 假设有input.txt文件内…

    Java 2023年5月27日
    00
  • Springmvc返回html页面问题如何解决

    在Spring MVC中,返回HTML页面是一个常见的需求。但是,如果直接返回HTML页面,可能会遇到一些问题,例如无法解析HTML页面中的动态内容、无法使用模板引擎等。下面是解决这些问题的攻略: 1. 使用模板引擎 使用模板引擎可以解决HTML页面中的动态内容问题。常见的模板引擎有Thymeleaf、Freemarker、Velocity等。这些模板引擎可…

    Java 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部