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日

相关文章

  • JSP模板应用指南(下)

    JSP模板应用指南(下) 概述 在“JSP模板应用指南(上)” 中,我们介绍了如何使用 JSP 模板进行页面结构的组织和管理,以及如何使用 Express 与 EJS 结合进行页面渲染。在本篇文章中,我们将继续讨论 JSP 模板的使用,重点介绍如何使用 JSP 模板进行一些常见的 Web 应用场景的开发。 除了上一篇文章中介绍的模板引擎之外,本文还将向大家介…

    Java 2023年6月15日
    00
  • servlet 解决乱码问题

    当使用servlets编写Java Web应用程序时,遇到乱码问题是非常常见的情况。在处理用户提交的数据、渲染html页面等场景下,可能会出现中文乱码的问题,这时就需要使用一些技巧来解决。下面是详细的“servlet 解决乱码问题”的完整攻略以及两条实例: 1. 字符编码设置 HTTP请求的Content-Type头部包含一个编码标志,表示请求中发送的正文编…

    Java 2023年5月20日
    00
  • UML类图

    UML类图介绍 概念 UML中的类图(Class Diagram)用于表示类、接口、实例等之间相互的静态关系。虽然名字叫作类图,但是图中并不仅仅只有类。 类结构 继承 该图展示了Parentclass和Childclass两个类之间的关系,其中的空心箭头表明了两者之间的层次关系。箭头由子类指向父类,换言之,这是表示继承(extends)的箭头。ParentC…

    Java 2023年4月22日
    00
  • springboot @RequestBody 接收字符串实例

    下面我来详细讲解”springboot @RequestBody 接收字符串实例”的完整攻略。 1. @RequestBody 简介 @RequestBody注解用于接收前端发送的请求体数据,常用于POST请求中。使用该注解可以让SpringBoot自动将请求体转化为方法的参数。 2. 使用步骤 接收字符串类型的@RequestBody,主要有以下两个步骤:…

    Java 2023年5月27日
    00
  • Spring依赖注入的几种方式分享梳理总结

    Spring依赖注入的几种方式分享梳理总结 什么是依赖注入(Dependency Injection,DI) 简单来说,依赖注入就是将对象所依赖的其他对象注入到其内部。这样可以达到解耦的效果,提高代码的可维护性。 通常,依赖注入需要依赖容器完成,目前比较常用的容器有Spring、Guice等。 Spring依赖注入的几种方式 1.构造注入(Construct…

    Java 2023年5月19日
    00
  • Java在创建文件时指定编码的实现方法

    在Java中创建文件时,可以通过指定编码来确保文件的正确性,避免可能出现的乱码问题。具体实现方法如下: 1. 使用OutputStreamWriter和FileOutputStream 在使用FileOutputStream创建文件时,需要指定文件路径和文件名,同时创建OutputStreamWriter时需要指定编码类型。代码如下示例: // 定义文件路径…

    Java 2023年5月20日
    00
  • springdata jpa单表操作crud的实例代码详解

    下面我将为您详细讲解“springdata jpa单表操作crud的实例代码详解”的完整攻略。 一、前言 Spring Data JPA是Spring Data中一个很重要的模块,可以方便地进行关系型数据库的访问和操作。在本篇攻略中,我们将详细讲解如何使用Spring Data JPA进行单表操作CRUD。 二、准备工作 在使用Spring Data JPA…

    Java 2023年5月20日
    00
  • 详解SimpleDateFormat的线程安全问题与解决方案

    问题描述: SimpleDateFormat 是Java中用于格式化日期的类,它用来将给定的日期字符串转换为 Date 对象,或将 Date 对象格式化为指定格式的日期字符串。 然而,在多线程环境中使用 SimpleDateFormat 时,可能会出现线程不安全的问题,从而导致程序出错或结果不如预期。 问题原因: SimpleDateFormat 的实例不是…

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