Java队列-queue

Java 数据结构之队列(Queue)详解 但需要注意的是,由于数组的容量是固定的,当队列已满时,无法再添加新的元素,除非进行元素的出队操作。通过enqueue()方法将元素入队,dequeue()方法将元素出队,peek()方法返回队列头部元素,size()方法返回队列当前元素个数,isEmpty()方法和isFull()方法检查队列是否为空或已满。Deque接口还提供了一些其他方法,如size()用于返回双端队列中的元素个数,isEmpty()用于判断双端队列是否为空,clear()用于清空双端队列中的所有元素等。 阅读详情

1. 使用场景

银行排队的案例:

2. 基本介绍

  • 队列是一个有序列表,可以用数组或是链表来实现。
  • 遵循先入先出的原则。即先存入队列的数据,要先取出;后存入的要后取出。

3. 数组模拟队列

思路

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

因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 和 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改变,如图所示: 

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

1) 将尾指针往后移:rear+1 , 当 front == rear 【空】

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

不足

  • 数组只能使用一次,当队列中的数据取出后,并不能复用之前用过的空间。
  • 优化参考环形队列

实现

  • 添加元素,改变队尾指针 rear 的值;
  • 移出元素,改变队头指针 front 的值;
  • 其他操作不改变队头队尾的值,只在值基础上运算(取出队头为:front + 1)

数组队列

package com.zsy.datastructure.queue;

/**
 * 使用数组模拟队列
 *
 * @author zhangshuaiyin
 */
public class ArrayQueue {

    /**
     * 队列最大空间
     */
    private int maxSize;
    /**
     * front: 指向队列头的前一个位置,用于标识队列头
     * rear:指向队列尾部
     */
    private int front;
    private int rear;
    private int[] array;

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

    /**
     * @return 判断队列是否为空
     */
    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * @return 判断队列是否已满
     */
    public boolean isFull() {
        return rear == maxSize - 1;
    }

    /**
     * 向队列添加元素
     *
     * @param item 元素
     */
    public void add(int item) {
        if (isFull()) {
            System.out.println("队列已满,不能添加元素~~");
            return;
        }
        // rear 后移,新增一个存储空间
        rear++;
        array[rear] = item;
    }

    /**
     * 出队
     *
     * @return 头部数据
     */
    public int remove() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空不能取出数据!!");
        }
        return array[++front];
    }

    /**
     * 打印队列中的元素
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("The queue is empty.");
            return;
        }
        for (int i = 0; i < array.length; i++) {
            System.out.printf("arr[%d]=%d\n", i, array[i]);
        }
    }
    
    /**
     * 打印队列头部元素
     */
    public void head() {
        if (isEmpty()) {
            System.out.println("The queue is empty.");
            return;
        }
        System.out.println("head: " + array[front + 1]);
    }
}

测试

package com.zsy.datastructure.queue;

import java.util.Scanner;

/**
 * @author zhangshuaiyin
 */
public class ArrayQueueTest {
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(3);

        // 接收输入字符
        char key;
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop) {
            System.out.println("****************");
            System.out.println("s(show): 显示队列");
            System.out.println("a(add): 添加数据");
            System.out.println("g(get): 取出数据");
            System.out.println("h(head): 头部数据");
            System.out.println("按其他任意键退出...");
            System.out.println("****************");
            key = scanner.next().charAt(0);
            switch (key) {
                case 's':
                    queue.show();
                    break;
                case 'a':
                    System.out.println("请输入要添加队列的数字:");
                    int value = scanner.nextInt();
                    queue.add(value);
                    break;
                case 'g':
                    try {
                        System.out.println("取出的数据:" + queue.remove());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    queue.head();
                    break;
                default:
                    scanner.close();
                    loop = false;
                    System.out.println("程序退出~~");
                    break;
            }
        }
    }
}

4. 数组循环队列

参考《大话数据结构》

思路分析

  • front:指向队列的第一个元素,初始值为0;
  • rear:指向队列最后一个元素的下一个位置,且该位置为保留位,不会被数据占用;
  • 当队列满时,rear 应该指向 front 的前一个位置,即  (rear + 1) % maxSize == front();

  • 当队列为空时,front == rear,即出队时 front 后移,当移动到保留位置,表示队列空;
  • 队列中的元素个数:(rear - front + maxSize) % maxSize
    • 当rear > front,长度为:rear - front

    • 当 rear < front,长度为:(0 + rear) + (maxSize - front) = rear - front + maxSize

代码实现:

循环队列

package com.zsy.datastructure.queue;

/**
 * 数组实现循环队列
 *
 * @author zhangshuaiyin
 */
public class CircleArrayQueue {
    /**
     * 数组最大长度,因为rear预留位,队列长度会少一位
     */
    private int maxSize;
    /**
     * front: 指向队列头一个元素
     */
    private int front;
    /**
     * rear: 指向队列最后一个元素的下一个位置
     * rear指向的位置为保留位,不会被元素占用
     */
    private int rear;
    private int[] array;

    public CircleArrayQueue(int arrayMaxSize) {
        this.maxSize = arrayMaxSize;
        array = new int[maxSize];
        this.front = this.rear = 0;
    }

    /**
     * @return 判断队列是否为空
     */
    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * @return 判断队列是否已满
     */
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    /**
     * 向队列添加元素
     *
     * @param item 元素
     */
    public void add(int item) {
        if (isFull()) {
            System.out.println("队列已满,不能添加元素~~");
            return;
        }
        array[rear] = item;
        // rear 后移,当移动到最后一个位置时,从 0 重新计数
        rear = (rear + 1) % maxSize;
    }

    /**
     * 出队
     *
     * @return 头部数据
     */
    public int remove() {
        if (isEmpty()) {
            throw new RuntimeException("队列为空不能取出数据!!");
        }
        // 取出数据为:array[front], 取出后 front 后移,当移动到最后一个位置时,从 0 重新计数
        int value = array[front];
        front = (front + 1) % maxSize;
        return value;
    }

    /**
     * 打印队列中的元素,从front开始到最后一个元素
     */
    public void show() {
        if (isEmpty()) {
            System.out.println("The queue is empty.");
            return;
        }
        for (int i = front; i < front + size(); i++) {
            System.out.printf("arr[%d]=%d\n", i % maxSize, array[i % maxSize]);
        }
    }

    /**
     * 打印队列头部元素
     */
    public void head() {
        if (isEmpty()) {
            System.out.println("The queue is empty.");
            return;
        }
        System.out.println("head: " + array[front]);
    }

    /**
     * @return 获取队列数据个数
     */
    public int size() {
        return (rear - front + maxSize) % maxSize;
    }
}

测试

package com.zsy.datastructure.queue;

import java.util.Scanner;

/**
 * @author zhangshuaiyin
 */
public class CircleArrayQueueTest {
    public static void main(String[] args) {
        CircleArrayQueue queue = new CircleArrayQueue(3);

        // 接收输入字符
        char key;
        Scanner scanner = new Scanner(System.in);
        boolean loop = true;
        while (loop) {
            System.out.println("****************");
            System.out.println("s(show): 显示队列");
            System.out.println("a(add): 添加数据");
            System.out.println("g(get): 取出数据");
            System.out.println("h(head): 头部数据");
            System.out.println("按其他任意键退出...");
            System.out.println("****************");
            key = scanner.next().charAt(0);
            switch (key) {
                case 's':
                    queue.show();
                    break;
                case 'a':
                    System.out.println("请输入要添加队列的数字:");
                    int value = scanner.nextInt();
                    queue.add(value);
                    break;
                case 'g':
                    try {
                        System.out.println("取出的数据:" + queue.remove());
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    queue.head();
                    break;
                default:
                    scanner.close();
                    loop = false;
                    System.out.println("程序退出~~");
                    break;
            }
        }
    }
}

青山不改,绿水常流!谢谢大家

反激开关电源变压器设计实战:从理论到绕制的完整流程解析 本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。 阅读详情

相关推荐

python -- 海洋气象科研论文中常用绘图配色汇总

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。可以通过自定义选取不同颜色的rgb,通过自定义的方式构建colormap。

weixin_68789096的博客 972

【尚硅谷Java数据结构与算法】队列和循环队列

1. 使用场景 银行排队的案例: 2. 基本介绍 队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即先存入队列的数据,要先取出;后存入的要后取出。 3. 数组模拟队列 思路 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。 因为队列的输出、输入是分别从前后端来处理,因此需要两个变量 front 和 rear 分别记录队列前后端的下标,front 会随着数据输出而改变,而 rear 则是随着数据输入而改.

Ep流苏的博客 556

电流采样(分流器与霍尔传感器)

霍尔效应霍尔效应是磁电效应的一种,这一现象是霍尔(A.H.Hall,1855—1938)于1879年在研究金属的导电机构时发现的。霍尔效应是研究半导体材料性能的基本方法。通过霍尔效应实验测定的霍尔系数,能够判断半导体材料的导电类型、载流子浓度及载流子迁移率等重要参数。简单原理如图1所示,半导体薄片两端通以控制电流I,垂直方向施加磁感应强度为B的匀强磁场,d为半导体材料的厚度,k为霍尔常数,它与半导体材质有关,则在垂直于电流和磁场的方向上,将产生电势差为UH的霍尔电压,它们之间的关系为。霍尔元件。

weixin_48867130的博客 1万+

java一次性队列

队列介绍 1:队列是一个有序列表,可以用数组或是链表来实现。 2:遵循先入先出的原则,既:先存入队列的数据,要先取出,后存入的要后取出。 3:示意图:使用数组模拟队列示意图: 数组模拟队列: 1:队列本身就是有序列表,如果使用数组的结构来储存队列的数据,则队列数组的声明如下图,其中maxsize是该队列的最大容量。 2:因为队列的输出,输入是分别从前向后来处理的,因此需要定义两个变量front和rear分别纪录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据的输入而改变。

qq_61630897的博客 939

Python 映射函数map()详解

Python 映射函数map()详解

分享我的点点滴滴,在成长路上与你同行! 2139

运行后选择GDB/LLDB出现这样的窗口:launch: program ‘输入程序名称,例如 D:\Desktop\新建文件夹\a.exe‘ does not exist...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1127

java批量消费队列(BlockingQueue)中的数据

java批量消费队列(BlockingQueue)中的数据

weixin_42326851的博客 8588

解决宿主机Ping不通虚拟机的问题

在使用虚拟机的过程中,我们常常会遇到宿主机和虚拟机之间无法相互通信的问题。具体来说,我们要查看虚拟机和宿主机的 IP 地址,然后尝试进行 Ping 测试。在某些情况下,我们可能发现 Ping 虚拟机不通,接下来我将分享如何解决这个问题。

howard2005的专栏 7万+

python怎么从另一个线程里取数据_java多线程从队列中取出数据执行

先用python实现, 把每一个要处理的参数存放到队列Queue中, 然后创建线程从队列中取出class ThreadExecuteJob(threading.Thread):"""Threaded Url Grab"""def __init__(self, queue):threading.Thread.__init__(self)self.queue = queuedef run(self):...

weixin_39568659的博客 458

基于鸿蒙 UniProton 的汽车电子系统开发指南

基于鸿蒙UniProton实时操作系统,提供了汽车电子系统开发的完整指南。通过统一的设计模式和开发规范,实现了高效、可靠的汽车电子系统开发。

m0_67505153的博客 178

AI硬件加速:CPU vs GPU性能对比

AI硬件加速:CPU vs GPU性能对比 关键词:人工智能、硬件加速、CPU、GPU、性能对比、硬件架构、并行计算、优化策略、项目实战 摘要: 本文将深入探讨AI

AI天才研究院 1913

Java数据结构之队列与环形队列

队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出示意图:(使用数组模拟队列示意图)

weixin_42145631的博客 322

虚幻商城 Quixel 免费资产一键入库

在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。

一碗清深的博客 3285

Java中队列(Queue)用法

Java中队列queue的用法 数据结构 队列

Sueko的博客 3万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

超全面Java中的队列(Queue)

本文图文并茂试图将抽象的概念以现实生活中的实例,具象队列旨在方便更好的理解队列,此外,还介绍了循环队列和双端队列(Deque)的概念及其实现方法,展示了如何用队列实现栈以及用栈实现队列 只有你知道什么是你的幸福 ------- 二十二 加油赶路人

LL_break的博客 3184

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java queue 队列_队列(Queue)

在“队列”(Queue)这种数据结构中,数据项是先进先出(FIFO:first in first out)。队列的容量可以有限,也可以是无限的。一、基于数组的Queue实现一般情况下,对于Queue而言,最核心的操作是:插入队列(enqueue)、移出队列(dequeue)。因为在队列中,插入操作是插入到队列的最后,而移出操作是移出队列的头部元素。因此我们通常会使用两个变量front(队头指针)和...

weixin_32591455的博客 880

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Java】Java队列Queue使用详解

Queue是java中实现队列的接口,它总共只有6个方法,我们一般只用其中3个就可以了。Queue的实现类有LinkedList和PriorityQueue。最常用的实现类是LinkedList。

devnn的专栏 9万+

Java——队列(Queue)

插入:添加元素到队列。删除:移除队列的元素。查看:查看队列中的元素。

tm1560000的博客 540

Java——队列(Queue)

本文主要讲了队列的方法使用、链式结构和顺序结构(循环队列)的功能模拟实现

wx2023_10_15的博客 990

java集合 Queue队列

Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Deque接 口。 Queue的实现 Queue的实现在Java中主要有三种,即: 1.普通的队列其又分为了队列和堆(优先级队列) 2.双端队列Deque 3.阻塞队列:最为有名的队列实现。 阻塞队列与普通队列...

zuo_h_dr的博客 337

深入理解Java中的队列(Queue)

队列是一种线性数据结构,它的特点是先进先出。在队列中,元素的添加(入队)操作在队尾进行,而元素的移除(出队)操作则在队头进行。因此,队列可以被简单地描述为一个“先进先出”的容器。在Java中,队列接口继承自Collection接口,并提供了丰富的方法来操作队列中的元素。

2201_75437633的博客 2万+

java 队列 queue_Java队列Queue

上个星期总结了一下synchronized相关的知识,这次将Queue相关的知识总结一下,和朋友们分享。在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻...

weixin_39951112的博客 139

Java集合基础:Queue 队列

目录 一、什么是队列 二、队列的种类 1、单队列 2、循环队列: 三、Java 集合框架中的队列 Queue 四、Queue 方法介绍: 1、 add(E), offer(E) 在尾部添加: 2、remove(), poll() 删除并返回头部: 3、element(), peek() 获取但不删除: 4、其他 一、什么是队列 队列是数据结构中比较重要的一种类型,它支持 F...

Java Punk 863

Java队列(queue)详解

在 Java 中,(Queue)是一个非常重要的数据结构,它遵循的原则。队列的操作方式是,元素先进入队列(入队),然后按照进入的顺序依次离开队列(出队)。队列常用于需要按照顺序处理任务的场景,如任务调度、广度优先搜索等。Java 提供了多个队列的实现,最常用的接口是Queue,其实现类包括LinkedListArrayDeque等。下面,我们将对队列的概念、常见操作、实现类及应用做一个详细的介绍。

m0_69529796的博客 2029

Java队列Queue的使用

Queue   Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。 BlockingQueue(阻塞队列) 继承了Queue接口,涉及到多线程后面会讲。 Que...

yuan_dai_ma的博客 2110

java队列详解_Java—Queue队列详解

QueueQueue队列介绍Queue队列介绍Queue是用于模拟队列的,啥叫队列?队列就是排队的意思,比如排队结账,先进入队伍中,先排到先付账走人;后排到的,进入队伍,等前面的人出队伍后,再跟在后面付钱出队。符合“先进先出FIFO”的规则,是一种线性表。插入在一端,删除则在另一端。入队(offer)在队尾,出队(poll)在队头。   Queue接口有实现类PriorityQueue,有另一个双...

weixin_34345695的博客 581
上一篇: iOS中对OC对象的探寻
下一篇: SpringBoot 自动装配原理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值