数组模拟队列之深度解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 数组模拟队列之深度解析

1.3 数组模拟队列


1.3.1 队列介绍


(1)队列是一个有序列表,可以用数组或者链表来实现

(2)遵循先入先出的原则。即先存入队列的数据要先取出,后存入的要后取出

(3)示意图

1670050380208.jpg

1.3.2 数组模拟队列思路


(1)队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量

(2)因为队列的输出、输入是分别从前后端来处理,因此需要两个变量frontrear分别记录队列前后端的下标,front回随着数据输出而改变,而rear则是随着数据输入而改变

(3)当我们将数据存入队列时称为addQueue , addQueue的处理需要有两个步骤:思路分析

① 当尾指针往后移动:rear + 1 , 当front== rear [空]

② 若尾指针rear小于队列的最大下标 maxSize - 1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear == maxSize - 1


1.3.3 代码实现


class ArrayQueue {
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr;

上方代码详解

(1)maxSizeArrayQueue最大容量

(2)frontArrayQueue头节点

(3)rear:ArrayQueue的尾节点

(4)int[ ] arr:该数组用于存放数据,模拟队列

public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
        front = -1;
        rear = -1;
    }

上方代码详解

(1)此处定义一个ArrayQueue队列构造器,同时定义一个arrMaxSize用于存储数组最大容量

(2)将arrMaxSize赋值给ArrayQueue的最大容量值

(3)开辟一个新的内存空间arr用于存放数组,该数组作用为存放数据、模拟队列

(4)frontrear所指向的值并无实际意义,只是单纯赋值

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

(1)isFull():该方法用于判断队列是否满,当队列满时,效果如下图,ArrayQueue的尾节点指向MaxSize-1,证明此时队列已满

1670050409807.jpg

(2)isEmpty():该方法用于判断队列是否空,当队列空时,效果如下图,ArrayQueue的头尾节点均指向头部,整明此时队列里面没有数据,队列为空

1670050420712.jpg

(3)特别声明MaxSize-1的设定并非随意,考虑到数组实际可用空间大小为最大内存-1,故该数组模拟队列的实际可用大小为MaxSize-1

public void addQueue(int n) {
    if (isFull()) {
        System.out.println("队列已满,不能继续添加数据");
        return;
    }
    rear++;
    arr[rear] = n;
}

上方代码详解

(1)我们定义一个addQueue()方法用于添加队列数据,定义一个n变量作为插入的数值

(2)首先得判断队列是否为满,故if (isFull()),如果为满,则 System.out.println打印输出告知读者队列已满,并用return进行返回

(3)若队列未满,则指向尾节点的rear后移一位,腾出一个空间用于存放该数据,将n变量赋值给数组模拟环形队列arr[]中的rear位置

public int getQueue() {
        if (isEmpty()) {
            throw new RuntimeException("队列空,不能取数据");
        }
        front++;
        return arr[front];
    }

上方代码详解

(1)我们定义一个getQueue()方法用于获取队列中的数据

(2)首先得判断队列是否为空,故 if (isEmpty()),如果为空,则抛出异常告知读者该队列为空,不能取出数据

(3)如果队列不为空,则front后移。此处front后移的原因是因为front指向头节点,当你把这个数据从队列取出来之后,front要自动前往下一个节点,故front++

(4)最后return一下arr[]front的位置

public void showQueue() {
    if (isEmpty()) {
        System.out.println("队列空的,没有数据");
        return;
    }
    for (int i = 0; i < arr.length; i++) {
        System.out.printf("arr[%d] = %d\n", i, arr[i]);
    }
}

上方代码详解

(1)我们定义一个showQueue()方法用于展示队列中的数据

(2)首先得判断队列是否为空,故 if (isEmpty()) {,如果为,则System.out.printf打印输出该队列为空不能取出数据

(3)使用for循环来遍历arr[]的长度,格式化输出该队列

public int headQueue() {
    if (isEmpty()) {
        throw new RuntimeException("队列空的,没有数据");
    }
    return arr[front + 1];
}

上方代码详解

(1)我们定义一个headQueue()方法用于展示队列的头节点(头数据)

(2)首先得判断队列是否为空,故 if (isEmpty()) ,如果为空,则抛出异常告知读者该队列为空,不能取出数据

(3)若队列不为空,则取出arr[]front+1的位置的数据,此处front+1是因为由于数组下标的特性

相关文章
|
5天前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
|
26天前
|
存储 JavaScript 前端开发
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
|
3月前
|
存储 算法 搜索推荐
深入解析String数组的操作与性能优化策略
深入解析String数组的操作与性能优化策略
|
3月前
|
安全 Java 调度
Java Queue深度解析:LinkedList为何成为队列的最佳实践?
【6月更文挑战第18天】Java的`LinkedList`适合作为队列,因其双向链表结构支持O(1)的头尾操作。非线程安全的`LinkedList`在单线程环境下效率高,多线程时可通过`Collections.synchronizedList`封装。此外,它还可兼做栈和双端队列,提供任务调度的高效解决方案。
40 3
|
3月前
|
消息中间件 存储 NoSQL
Celery:高效异步任务队列的深度解析与应用实践
Celery 是一个流行的 Python 分布式任务队列,用于处理耗时的异步任务,提升Web应用性能。它包括消息中间件(如RabbitMQ、Redis)、任务生产者和消费者。Celery支持异步处理、分布式执行、任务调度、结果存储和错误处理。通过一个发送邮件验证码的实例,展示了如何安装配置、定义任务、触发任务以及查看执行结果。Celery的使用能有效优化应用响应速度和资源管理。
457 3
|
2月前
|
存储 算法 搜索推荐
深入解析String数组的操作与性能优化策略
深入解析String数组的操作与性能优化策略
|
3月前
|
存储 Java 数据库
解析和使用String数组的方法
解析和使用String数组的方法
|
3月前
|
存储 JavaScript 前端开发
JavaScript——JavaScript基础:数组 | JavaScript函数:使用、作用域、函数表达式、预解析
在JavaScript中,内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数。①全局变量:不在任何函数内声明的变量(显式定义)或在函数内省略var声明的变量(隐式定义)都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用。函数表达式与函数声明的定义方式几乎相同,不同的是函数表达式的定义必须在调用前,而函数声明的方式则不限制声明与调用的顺序。③块级变量:ES 6提供的let关键字声明的变量称为块级变量,仅在“{}”中间有效,如if、for或while语句等。
47 0
|
3月前
|
JSON 资源调度 Kubernetes
实时计算 Flink版操作报错合集之解析JSON数组时,遇到报错,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
4月前
|
存储 搜索推荐 编译器
C语言数组深入解析与实战应用
C语言数组深入解析与实战应用
40 0

热门文章

最新文章

推荐镜像

更多