Java数组队列及环形数组队列超详细讲解

Java数组队列及环形数组队列超详细讲解

什么是队列

队列(Queue)是一种先进先出(FIFO, first in first out)的数据结构,常见的队列有数组队列和链式队列两种实现方式。

数组队列

数组队列是一种线性结构,底层使用静态数组来存储数据。队列的头部(front)指向队列头部元素,队列尾(rear)指向队列尾部元素。当有新元素入队时,队列尾指针往后移动一位,并将新元素放入队列尾部。当有元素出队时,队列头部指针往后移动一位,并返回头部元素值。当队列头部和队列尾部指针重合时,表示队列为空。当队列尾部指针指向数组最后一个元素时,即使队列中已有空闲位置,也无法再增加元素,这就是数组队列的局限性。

Java实现

public class ArrayQueue {

    private int maxSize;  // 队列的最大容量
    private int[] queue;  // 队列存储数组
    private int front;    // 队列头部指针
    private int rear;     // 队列尾部指针

    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        this.queue = new int[maxSize];
        this.front = -1;  // 指向队列头部前一个位置
        this.rear = -1;   // 指向队列尾部
    }

    public boolean isFull() {
        return rear == maxSize - 1;
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public void add(int num) {
        if (isFull()) {
            throw new RuntimeException("队列已满");
        } else {
            rear++;
            queue[rear] = num;
        }
    }

    public int remove() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        } else {
            front++;
            return queue[front];
        }
    }

    public void print() {
        if (isEmpty()) {
            System.out.println("队列为空");
        } else {
            for (int i = front + 1; i <= rear; i++) {
                System.out.print(queue[i] + "\t");
            }
            System.out.println();
        }
    }
}

示例1

public static void main(String[] args) {
    ArrayQueue queue = new ArrayQueue(5);
    queue.add(1);
    queue.add(2);
    queue.add(3);
    queue.print();   // output: 1  2  3
    queue.remove();
    queue.print();   // output: 2  3
}

环形数组队列

环形数组队列(Circular Queue)是一种将数组当做环来使用的队列,当队列尾部指针指向数组末尾时,指针回到数组头部,并继续从头部插入元素或从头部删除元素。这样的话,队列空间几乎可以无限扩充。

Java实现

public class CircularQueue {

    private int maxSize;  // 环形队列的最大容量
    private int[] queue;  // 环形队列存储数组
    private int front;    // 队列头部指针
    private int rear;     // 队列尾部指针

    public CircularQueue(int maxSize) {
        this.maxSize = maxSize;
        this.queue = new int[maxSize];
        this.front = 0;  // 指向队列头部
        this.rear = 0;   // 指向队列尾部
    }

    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    public boolean isEmpty() {
        return front == rear;
    }

    public void add(int num) {
        if (isFull()) {
            throw new RuntimeException("队列已满");
        }
        queue[rear] = num;
        rear = (rear + 1) % maxSize;
    }

    public int remove() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        int num = queue[front];
        front = (front + 1) % maxSize;
        return num;
    }

    public void print() {
        if (isEmpty()) {
            System.out.println("队列为空");
        } else {
            int size = (rear + maxSize - front) % maxSize;
            for (int i = 0; i < size; i++) {
                int index = (front + i) % maxSize;
                System.out.print(queue[index] + "\t");
            }
            System.out.println();
        }
    }
}

示例2

public static void main(String[] args) {
    CircularQueue queue = new CircularQueue(5);
    queue.add(1);
    queue.add(2);
    queue.add(3);
    queue.print();   // output: 1  2  3
    queue.remove();
    queue.print();   // output: 2  3
    queue.add(4);
    queue.add(5);
    queue.add(6);
    queue.print();   // output: 4  5  6
}

总结

本篇文章介绍了Java数组队列及环形数组队列的实现原理和代码实现,其中数组队列适用于队列容量较小的场景,而环形数组队列适用于队列容量较大或容量无法预估的场景。对于需要频繁进行入队和出队操作的场景,应优先选择链式队列。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数组队列及环形数组队列超详细讲解 - Python技术站

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

相关文章

  • 简易JDBC框架实现过程详解

    下面我来为你详细讲解一下“简易JDBC框架实现过程详解”的完整攻略。 1. 概述 JDBC是一种Java数据库连接机制,它允许Java应用程序通过执行SQL语句与数据库进行交互。JDBC API提供了访问和处理所有类型的关系型数据库管理系统(RDBMS)的标准方法。在实际开发中,使用JDBC API进行数据库操作的过程显得有些繁琐,因此我们可以考虑封装一些工…

    Java 2023年5月19日
    00
  • SpringBoot整合mybatis的方法详解

    下面我来为你详细讲解“SpringBoot整合mybatis的方法详解”的完整攻略。 准备工作 在maven中引入spring-boot-starter-jdbc、mybatis-spring-boot-starter、mysql-connector-java等依赖。 在application.properties中配置数据库信息和mybatis配置。 sp…

    Java 2023年5月19日
    00
  • java WebSocket 服务端实现代码

    下面是实现Java WebSocket服务端的完整攻略,包括示例说明。 准备工作 在开始编写WebSocket服务端代码之前,需要先确保拥有以下条件: Java开发环境,最好使用JDK8或以上版本。 WebSocket API,Java提供了JSR-356标准的WebSocket API,可以通过Maven添加依赖以使用API。 <dependency…

    Java 2023年5月19日
    00
  • 记录一次非常麻烦的调试

    此次记录一次非常麻烦的调试问题,不是纯知识分享,只是记录这次调试过程引以为戒。 问题简介 这个功能是公司2021年写的老功能,一直都没有更新过代码,这次在导入一个1.03G的大文件进行读取的过程中出问题了。简单介绍一下这个功能:公司使用的spring boot框架构建项目,该功能为项目内的一个接口调用功能。该功能首先,通过远程接口下载文件到局域网sftp服务…

    Java 2023年5月5日
    00
  • Spring Boot 2和Redis例子实现过程解析

    Spring Boot2和Redis例子实现过程解析 Redis是一个高性能的键值存储系统,常用于缓存、消息队列等场景。在Spring Boot应用程序中,我们可以使用Spring Data Redis来快速开发Redis相关的应用程序。本文将详细讲解Spring Boot2和Redis例子实现过程解析,并提供两个示例。 1. 添加Redis依赖 在pom.…

    Java 2023年5月15日
    00
  • JAVA中的日期时间类用法总结

    JAVA中的日期时间类用法总结 一、介绍 JAVA中的日期时间类可以用来处理日期、时间等与时间有关的业务。JAVA中内置了多个日期时间类,比较常用的有: Date类:这个类已经被替代了,不推荐使用。 Calendar类:是一个抽象类,提供了一组可以操纵日期、时间与之对应的字段的方法,同时还提供了其他的一些常用模块方法。 SimpleDateFormat类:可…

    Java 2023年5月20日
    00
  • apache开启伪静态的方法分享

    下面为你详细讲解“Apache开启伪静态的方法分享”的攻略。 什么是伪静态 伪静态是指利用服务器重写URL的技术将动态网址转化为静态网址,并使其能够被搜索引擎优化。伪静态技术可以为网站优化带来很多好处,如提高页面访问速度、提高搜索引擎友好度等。 Apache开启伪静态方法 Apache是一款流行的Web服务器,下面介绍如何在Apache上开启伪静态功能。 安…

    Java 2023年6月15日
    00
  • JavaWeb中的路径问题解读

    JavaWeb中的路径问题解读 在JavaWeb开发中,路径问题一直是困扰初学者的难点之一,本文将深入剖析JavaWeb中的路径问题,让读者对JavaWeb中的路径有更全面的理解。 1. 路径的种类 在JavaWeb中,常见的路径种类包括:绝对路径、相对路径、虚拟路径和物理路径。接下来分别进行讲解。 1.1 绝对路径 绝对路径是指从硬盘根目录开始的完整路径,…

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