Java数据结构之队列(动力节点Java学院整理)

Java数据结构之队列(动力节点Java学院整理)

队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。

队列的分类

  • 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。

  • 双端队列(Deque):是能够在队列任意一端入队和出队的队列。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队,因此队列的队首、队尾都是动态变化的。

  • 优先队列:优先队列这里不再讲解,有兴趣可以自行查阅。

队列的创建

Queue<String> queue = new LinkedList<>();
  • Queue是队列的接口,常见的实现类有LinkedListArrayDeque

  • LinkedList是一个用链表实现的双向队列,因此既可以表现出队列的特点,也可以表现出栈的特点

  • ArrayDeque是一个用数组实现的双向队列,它可以像队列一样在队尾添加元素,在队首弹出元素;同时也可以像栈一样,在队尾添加元素,在队尾弹出元素。

队列的常用方法

插入方法

  • offer(E e):向队列末端插入一个元素
Queue<String> queue = new LinkedList<>();
queue.offer("first");
queue.offer("second");
  • add(E e):向队列末端插入一个元素,如果队列已满,则抛出异常
Queue<String> queue = new LinkedList<>();
queue.add("first");
queue.add("second");

查询方法

  • peek():返回队首元素,但不删除
Queue<String> queue = new LinkedList<>();
queue.offer("first");
queue.offer("second");
String peek = queue.peek();
System.out.println(peek);
System.out.println(queue);

输出结果为

first
[first, second]
  • element():返回队首元素,但不删除。如果队列为空,则抛出异常
Queue<String> queue = new LinkedList<>();
queue.offer("first");
queue.offer("second");
String element = queue.element();
System.out.println(element);
System.out.println(queue);

输出结果为

first
[first, second]

删除方法

  • poll():弹出队首元素,如果队列为空,则返回null
Queue<String> queue = new LinkedList<>();
queue.offer("first");
queue.offer("second");
String poll = queue.poll();
System.out.println(poll);
System.out.println(queue);

输出结果为

first
[second]
  • remove():弹出队首元素,如果队列为空,则抛出异常
Queue<String> queue = new LinkedList<>();
queue.offer("first");
queue.offer("second");
String remove = queue.remove();
System.out.println(remove);
System.out.println(queue);

输出结果为

first
[second]

示例说明

队列模拟银行排队场景

有一家银行,来到银行的客户需要在大厅排队等候叫号叫到自己号码时,才能进入办理业务。试用队列模拟这个场景。

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class BankQueueSimulation {

    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();
        for (int i = 1; i <= 10; i++) {
            String number = String.format("%03d", i);
            queue.offer(number);
        }
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.print("请输入你的号码:");
            String inputNumber = scanner.next();
            if (queue.contains(inputNumber)) {
                while (!queue.peek().equals(inputNumber)) {
                    String otherNumber = queue.poll();
                    System.out.println("现在叫到" + otherNumber + "号,请等待。");
                }
                queue.poll();
                System.out.println("现在叫到" + inputNumber + "号,请进入。");
                break;
            } else {
                System.out.println("该号码不在队列中,请重新输入。");
            }
        }
    }
}

以上程序模拟了一个银行的叫号排队场景。程序先使用循环将10个固定号码插入队列中,接着通过输入将客户的号码加入到队列中。如果队列中存在该号码,程序就会循环弹出队列中的元素,直到遇到该号码,然后弹出该号码,输出提示让客户进入办公室办理业务。

双端队列模拟操作系统任务队列

对于操作系统,通常有两种情况将任务加入任务队列:

  1. 普通任务,当任务执行时会将自己从队列中删除
  2. 定时任务,当任务超时时才会将自己从队列中删除

这里就不再讨论第二种情况。

import java.util.ArrayDeque;
import java.util.Queue;

public class SystemTaskQueueSimulation {

    public static void main(String[] args) {

        Queue<Integer> taskQueue = new ArrayDeque<>();

        System.out.println("-----初始化任务队列-----");
        for (int i = 1; i <= 5; i++) {
            int taskId = i * 10;
            taskQueue.offer(taskId);
            System.out.println("插入任务" + taskId);
        }

        System.out.println("-----开始遍历任务队列,添加任务,删除任务-----");
        System.out.println("首先插入一个任务");
        taskQueue.offer(60);    //添加一个任务

        System.out.println("当前任务队列中队列首:" + taskQueue.peek());
        int task1 = taskQueue.poll();    //删除队列首的第一个任务
        System.out.println("删除成功,删除任务" + task1);
        System.out.println("当前任务队列中队列首:" + taskQueue.peek());

        System.out.println("再插入两个任务");
        taskQueue.offer(70);
        taskQueue.offer(80);
        System.out.println("当前任务队列中队列首:" + taskQueue.peek());

        int task2 = taskQueue.poll();    //删除队列首的第一个任务
        System.out.println("删除成功,删除任务" + task2);
        System.out.println("当前任务队列中队列首:" + taskQueue.peek());

        System.out.println("再插入两个任务");
        taskQueue.offer(90);
        taskQueue.offer(100);
        System.out.println("当前任务队列中队列首:" + taskQueue.peek());
    }
}

在上述程序中,使用ArrayDeque实现了一个双端队列,循环添加5个任务到任务队列中。接着,我们向任务队列中再添加一个任务,查看队列中的任务顺序,删除队列首的第一个任务,再查看队列中的任务顺序,最后再插入两个任务观察队列中的任务顺序变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之队列(动力节点Java学院整理) - Python技术站

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

相关文章

  • mosn基于延迟负载均衡算法 — 走得更快,期待走得更稳

    前言 这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。 对分布式系统中延迟出现的原因进行剖析 介绍mosn都通过哪些方法来降低延迟 构建来与生产环境性能分布相近的测试用例来对算法进行验证 地址:https://github.com/mosn/mosn/pull/2253 在开始聊基于延迟的负载均衡算法之前,先介绍下什么是负载均衡——…

    算法与数据结构 2023年5月8日
    00
  • C语言数据结构系列之树的概念结构和常见表示方法

    C语言数据结构系列之树的概念结构和常见表示方法 树是一种非线性数据结构,它由若干个节点构成,节点之间通过边来连接,具有层次关系。 树的基本概念和术语 节点:树中的元素,它可以包含一个数据元素或多个数据元素,一个节点也可以称为一个分支节点。 根节点:树的最上层节点,它没有父节点。 叶子节点:没有子节点的节点称为叶子节点。 父节点和子节点:父节点是某个节点的上一…

    数据结构 2023年5月17日
    00
  • C语言实现数据结构迷宫实验

    C语言实现数据结构迷宫实验攻略 简介 迷宫是计算机图形学中的一个经典问题,也是数据结构和算法中常见的题目。C语言是一种广泛使用的编程语言,具有充分的编程接口和功能,可以方便地实现迷宫算法和数据结构。 本文将详细讲解C语言实现数据结构迷宫实验的完整攻略,让读者能够更加深入地理解迷宫算法和数据结构的应用。 实现步骤 1. 创建迷宫结构体 首先需要创建一个迷宫结构…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解 本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。 单链表的定义 单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。 单链表的节点定义 单链表的节点通常由结…

    数据结构 2023年5月17日
    00
  • C语言数据结构中串的模式匹配

    C语言数据结构中串的模式匹配 什么是字符串的模式匹配? 字符串的模式匹配是指在一个主字符串中查找特定的子串,找到特定的子串后输出其在主字符串中的位置。 例如有一个主串”this is a test string”,要查找的子串为”string”,则字符串的模式匹配应能输出”string”在主串中的位置为17。 如何实现字符串的模式匹配? 字符串的模式匹配可以…

    数据结构 2023年5月17日
    00
  • 虹科案例 | 虹科Domo商业智能,助力保险公司逃离繁杂数据池!

    金融行业的发展充满着不确定性,一个具备强大承保能力和精算专业知识的资金池,对于身处该领域的公司和个人都是十分必要的。 在全国城市联盟(NLC)的协助下成立的NCL Mutual会员制互助保险公司,为各个地区城市提供了稳定的再保险答案。,然而,面对数字化转型这场已经打响的战斗,NCL Mutual却因缺乏中心商业智能系统,在利用数据处理索赔和承保的能力受到了极…

    算法与数据结构 2023年4月17日
    00
  • 数位dp

    数位dp 思想 一般来说,题目是要求在区间\([l,r]\)中符合某一种条件的数的个数 我们用前缀和的思想考虑,分别求出\([1,r]\)和\([1,l-1]\)中数的个数相减即为所求 这里采用记忆化搜索的方式实现 模板 #include<iostream> #include<cstring> #include<vector&g…

    算法与数据结构 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部