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

yizhihongxing

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日

相关文章

  • Mybatis源码解析之事务管理

    Mybatis源码解析之事务管理 什么是事务 事务是指一系列操作,这些操作必须同时成功或者同时失败。比如,银行转账操作就是一个事务,它包括从一个账户扣除金额并把金额加到另一个账户中。这个过程中如果其中一个操作失败,那么这个事务就必须回滚,保证不会出现数据不一致或者数据丢失的情况。 Mybatis中的事务管理 Mybatis提供了基于JDBC的事务管理,其中有…

    Java 2023年5月19日
    00
  • Java Base64位编码与String字符串的相互转换,Base64与Bitmap的相互转换实例代码

    Java中提供了Base64类用于编码和解码base64字符串,通过该类我们可以实现字符串和base64编码之间的相互转换,下面是详细的攻略: Base64位编码与String字符串的相互转换 编码 在Java中,我们可以使用java.util.Base64类的getEncoder()方法获取Base64编码器,通过调用该对象的encodeToString(…

    Java 2023年5月20日
    00
  • shell脚本监控MySQL服务是否正常

    下面就详细说明如何编写一个shell脚本来监控MySQL服务是否正常。 1. 编写脚本 首先可以使用vim等编辑器创建一个名为mysql_monitor.sh的文件,并在开头添加如下内容: #!/bin/bash #指明使用bash解释器 MYSQL=`which mysql` #获取mysql命令路径 MYSQL_CONF=/etc/my.cnf #mys…

    Java 2023年6月15日
    00
  • Java对象的内存布局详细介绍

    Java对象的内存布局是指一个Java对象在内存中的存储方式,通常指的是其在堆内存中的存储方式。它分为三部分:对象头、实例变量和填充字节。接下来我将对Java对象内存布局进行详细的介绍。 对象头 对象头是Java对象的头部分,占据了对象的8到12个字节。对象头存储了对象的元数据信息,包含两部分:对象的Mark Word和对象的Class Pointer。在3…

    Java 2023年5月26日
    00
  • Java实现高校教务系统

    Java实现高校教务系统完整攻略 一、需求分析和功能设计 在进行Java编程实现高校教务系统前,需要先对系统进行需求分析,梳理系统的核心功能,并进行功能设计。主要功能包括: 学生管理模块:包括学生信息的录入、查询、修改、删除等功能。 教师管理模块:包括教师信息的录入、查询、修改、删除等功能。 课程管理模块:包括课程信息的录入、查询、修改、删除等功能。 成绩管…

    Java 2023年5月23日
    00
  • SpringData Repository Bean方法定义规范代码实例

    下面是SpringData Repository Bean方法定义规范的完整攻略。 什么是Spring Data Repository Bean? Spring Data是Spring框架提供的一个子项目,它为各种数据存储技术提供了统一的访问方式。Spring Data Repository是Spring Data中最核心的组件之一,它提供了一种声明式的方式…

    Java 2023年5月20日
    00
  • Java编程风格的作用是什么?

    Java编程风格是规范Java代码书写风格的一系列规则和标准,具有以下作用: 提高代码可读性和可维护性良好的Java编程风格可以让代码更加易读、易懂、易维护,提高代码的可读性和可维护性,减少出错的可能性。 提高代码质量和规范性Java编程风格可以规范化代码的书写,减少代码的语法错误和逻辑错误,提高了Java代码的质量和规范性。 避免多人协作时的问题Java编…

    Java 2023年5月11日
    00
  • Java利用策略模式实现条件判断,告别if else

    下面我将详细讲解Java利用策略模式实现条件判断,告别if else的完整攻略。 策略模式简介 在软件开发中,经常会遇到多个算法或行为的选择问题,此时,使用if…else或switch…case来实现条件判断的效率不高,而且代码可读性较差。策略模式则可以很好地解决这个问题。 策略模式的核心思想是将具体算法和行为封装成一个独立的类,使得它们可以相互替换…

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