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]
阅读剩余 53%

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

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

相关文章

  • SpringBoot整合Dozer映射框架流程详解

    下面是SpringBoot整合Dozer映射框架的详细攻略: 一、什么是Dozer映射框架 Dozer是一款开源的JavaBean映射框架,它能够帮助我们快速、方便地完成复杂的JavaBean之间的转换工作。它通过XML文件配置JavaBean映射关系,从而实现JavaBean属性值之间的自动复制。 二、SpringBoot整合Dozer映射框架步骤 以下是…

    Java 2023年5月19日
    00
  • 深入了解Java包与访问控制权限

    下面是详细讲解“深入了解Java包与访问控制权限”的攻略。 什么是Java包和访问控制权限? Java包是将相关类组织起来,以便更好地管理和维护Java程序。Java中的访问控制权限指的是控制如何在类内或类之间访问Java类、方法和变量。 如何创建Java包? Java包的创建很简单,只需在Java源文件的顶部添加一个package声明,如下所示: pack…

    Java 2023年5月26日
    00
  • 微信小程序支付功能完整流程记录(前端)

    微信小程序支付功能完整流程记录(前端) 一、准备工作 在开始前,你需要具备以下工具和信息: 微信公众平台的AppID、AppSecret和商户号(若未注册,需要前往微信公众平台进行注册) 微信支付开发文档 二、接入微信支付 1. 获取用户授权 由于小程序的支付需要获取用户的授权,因此我们需先引入小程序官方提供的授权组件。 <view> <b…

    Java 2023年5月23日
    00
  • J2EE 开发购物网站 经验篇 – 建表

    作为网站的作者,对于“J2EE 开发购物网站 经验篇 – 建表”的完整攻略,我将从以下几个方面进行详细讲解: 确定数据库表的设计 在MySQL数据库中创建表格 表格字段的详解 示例说明 1. 确定数据库表的设计 在设计购物网站数据库表时,需要先确定需要存储的数据,以及各个数据之间的关系。一般来说,购物网站需要存储用户信息、商品信息、订单信息等数据。具体来说,…

    Java 2023年6月15日
    00
  • java实现短信验证码5分钟有效时间

    下面是Java实现短信验证码5分钟有效时间的攻略: 1. 生成验证码 我们可以使用Java的Random类生成随机的4-6位数字作为验证码。示例代码如下: import java.util.Random; public class VerificationCodeUtil { public static String generateVerification…

    Java 2023年6月15日
    00
  • 在IDEA 2020.3.1中部署Tomcat并且创建第一个web项目的过程详解

    下面是在IDEA 2020.3.1中部署Tomcat并且创建第一个web项目的详细攻略: 1. 配置Tomcat服务器 1.1 下载Tomcat 在Apache Tomcat的官网(http://tomcat.apache.org/)下载Tomcat,选择最新版本的Tomcat 9,下载完成后进行解压。可以将解压后的Tomcat文件夹放在一个容易找到的地方。…

    Java 2023年5月19日
    00
  • java 8 lambda表达式中的异常处理操作

    下面是“Java 8 Lambda表达式中的异常处理操作”的详细攻略。 什么是Lambda表达式中的异常处理操作 在Java 8中,Lambda表达式是一种新的语言特性,可以将一个方法作为参数传递给另一个方法,从而实现更加简洁、灵活的编程方式。在使用Lambda表达式时,有时会出现异常问题,因此需要进行异常处理操作,以保证代码的健壮性。 Lambda表达式中…

    Java 2023年5月27日
    00
  • Java实时监控日志文件并输出的方法详解

    Java实时监控日志文件并输出的方法,可以使用Java IO和多线程的知识来完成。主要流程可以分为以下几步: 创建一个文件读取器,用于读取日志文件的内容。 定义一个线程类,用于不断读取文件内容,并输出到控制台或其他存储介质中。 开启线程,开始实时监控日志文件。 具体实现步骤如下: 1、创建一个文件读取器 使用Java IO中的FileReader和Buffe…

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