Java循环队列与非循环队列的区别总结

Java循环队列与非循环队列的区别总结

什么是队列?

队列是计算机科学中一种常见的抽象数据类型,它代表了一组可以按顺序访问的元素,遵循 "先进先出" (FIFO) 的原则,也就是最先进入队列的元素最先被处理和弹出。

非循环队列

非循环队列是最普通的队列,也是最容易实现的。非循环队列采用静态数组或动态数组来实现。队列的读取位置(front) 和写入位置(rear) 需要时刻维护,它们初始值都为 -1。写入新数据时,将 rear 加 1,再将该位置上赋值为新的数据;从队列里弹出数据时,将front加1。当队列空时,front == rear;当队列满时,任何写操作都将被拒绝。

非循环队列示例

以下是一个非循环队列的基本实现示例:

public class ArrayQueue<E> {
    private E[] data;
    private int front, rear;

    public ArrayQueue(int capacity) {
        data = (E[]) new Object[capacity];
        front = -1;
        rear = -1;
    }

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

    public boolean isFull() {
        return rear == data.length - 1;
    }

    public void enqueue(E item) {
        if (isFull()) {
            throw new RuntimeException("Queue is full");
        }
        data[++rear] = item;
    }

    public E dequeue() {
        if (isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        }
        return data[++front];
    }
}

循环队列

循环队列和非循环队列的实现方式略有不同,循环队列会将数组当作环形数据结构来使用。相对于非循环队列,循环队列节省了数组的存储空间,但是编写起来更加复杂,需要处理队列队首和队尾指针的位置。循环队列的读取和写入合在一起,写入位置(rear) 和读取位置(front) 初始值都为0。向队列里添加新元素时,将rear指针往后移动一位,如果移动到队列尾部就从头开始;同理,从队列里弹出数据时,将front指针向后移动一位。当队列空时,front == rear;当队列满时,(rear+1) % data.length == front。

循环队列示例

以下是一个循环队列的基本实现示例:

public class CircularQueue<E> {
    private E[] data;
    private int front, rear;

    public CircularQueue(int capacity) {
        data = (E[]) new Object[capacity];
        front = 0;
        rear = 0;
    }

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

    public boolean isFull() {
        return (rear + 1) % data.length == front;
    }

    public void enqueue(E item) {
        if (isFull()) {
            throw new RuntimeException("Queue is full");
        }
        data[rear] = item;
        rear = (rear + 1) % data.length;
    }

    public E dequeue() {
        if (isEmpty()) {
            throw new NoSuchElementException("Queue is empty");
        }
        E item = data[front];
        front = (front + 1) % data.length;
        return item;
    }
}

总结

相比于非循环队列,循环队列具有以下优点:

  1. 更节省存储空间
  2. 更高效地利用数组,操作难度稍低
  3. 可以避免数组的内部碎片(数组不必满),从而提高性能

然而,循环队列相对于非循环队列也更加复杂,需要特殊考虑大量极端情况及边界情况。因此,在实际使用过程中,需要根据实际需求来选择合适的队列实现方式。

以上就是 Java循环队列与非循环队列的区别总结,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java循环队列与非循环队列的区别总结 - Python技术站

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

相关文章

  • 解析javascript 数组以及json元素的添加删除

    要解析JavaScript数组和JSON元素的添加和删除,我们需要做以下几个步骤: 1. 创建一个数组或JSON对象 首先,我们需要创建一个空的数组或JSON对象。 创建数组 let myArray = []; 创建JSON对象 let myJSON = {}; 2. 向数组或JSON对象中添加元素 添加元素是一种常见的操作,我们可以使用数组的push()方…

    Java 2023年5月26日
    00
  • 应用程序类加载器的作用是什么?

    应用程序类加载器的作用: Java应用程序在运行时,需要加载大量的类,这些类通常是由JDK自带的类库,以及我们自己编写的类组成的。为了保证程序可以正常运行,Java虚拟机需要通过类加载器来将这些类加载到内存中。而应用程序类加载器就是其中一种类加载器,其主要作用是从特定路径加载class文件到内存中,是类加载器中最常用的一种。 使用攻略: 首先需要了解应用程序…

    Java 2023年5月10日
    00
  • Java的抽象类 & 接口

    抽象类 如果自下而上在类的继承层次结构中上移,位于上层的类更具有通用性,甚至可能更加抽象。从某种角度看,祖先类更加通用,人们只将它作为派生其他类的基类,而不作为想使用的特定的实例类。例如,考虑一下对 Employee 类层次的扩展。一名雇员是一个人,一名学生也是一个人。下面将 Person 类和 Student 类添加到类的层次结构中。下图是这三个类之间的关…

    Java 2023年5月10日
    00
  • java中tomcat的80端口被占用问题解决

    当我们在运行Tomcat服务器时,可能会遇到端口被占用的问题,这就意味着我们无法使用Tomcat服务器。幸运的是,这个问题可以有多种方法进行解决。下面是一些常见的解决办法: 技巧一:检查端口是否被占用 首先,我们需要确认80端口是否真的被占用。我们可以利用一些命令来查看占用端口的情况。例如,在Windows中,可以使用以下命令检查: netstat -ano…

    Java 2023年6月2日
    00
  • Java servlet 使用 PrintWriter 时的编码与乱码的示例代码

    请看下面的攻略: Java Servlet PrintWriter 输出乱码问题 示例代码1 package com.example.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.…

    Java 2023年5月20日
    00
  • java实现动态数组

    下面是关于Java实现动态数组的完整攻略: 什么是动态数组? 动态数组,简称为ArrayList,是在Java中使用较为广泛的数据结构之一。它是一种可变数组,可以根据需要自动扩展数组的大小。与传统的数组不同,动态数组的大小是可以根据需求动态增长或者缩小的。 Java中动态数组的实现 在Java中,动态数组的实现是通过内部维护一个Object数组来实现。当需要…

    Java 2023年5月26日
    00
  • Struts2 S2-016漏洞修复总结

    Struts2 S2-016漏洞修复总结 概述 Struts2 S2-016是一种影响Struts框架的远程代码执行漏洞。攻击者可以通过构造恶意的OGNL表达式,在未经授权的情况下,远程执行任意代码。该漏洞影响Struts2版本2.0.0-2.3.15,2.3.16-2.3.28。 漏洞修复方法 确认是否受到漏洞影响 首先,需要确认目标服务器是否受到该漏洞的…

    Java 2023年5月20日
    00
  • 浅析Java中对象的创建与对象的数据类型转换

    这里是“浅析Java中对象的创建与对象的数据类型转换”的攻略。 1. 对象的创建 Java中的对象可以由new关键字创建,一个对象的创建需要以下步骤: 分配对象的内存空间:在堆内存中为新对象分配一片连续的空间,这个空间的大小由对象的数据类型和属性决定。 执行构造函数:在分配好内存空间之后,JVM会执行对象的构造函数,初始化对象的属性值等。 将对象的引用返回给…

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