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日

相关文章

  • 一起来看看C语言线性表的线性链表

    一起来看看C语言线性表的线性链表攻略 线性链表概述 线性链表是线性表的一种实现方式,它通过每个节点中包含指向下一个节点的指针来实现表中元素之间的链接,可以动态地增加、删除节点。线性链表分为带头节点的链表和不带头节点的链表,其中带头节点的链表更为常见。 实现思路 结构体定义 我们可以定义一个结构体来表示每个节点,例如: typedef struct ListN…

    数据结构 2023年5月17日
    00
  • Java数据结构之堆(优先队列)的实现

    Java 数据结构之堆(优先队列)的实现 什么是堆(优先队列) 堆(Heap)是一种数据结构,使用数组实现。堆分为小根堆和大根堆,大根堆满足父节点值大于子节点,小根堆则相反。堆通常被用来实现优先队列(Priority Queue)。 优先队列(Priority Queue)是一个能够让用户迅速查找到队列中最小值(或最大值)的抽象数据类型(ADT)。优先队列通…

    数据结构 2023年5月17日
    00
  • Java 超详细讲解数据结构的应用

    Java 超详细讲解数据结构的应用 简介 “Java 超详细讲解数据结构的应用”是一个基于Java语言的数据结构教程,其中包含了各种数据结构的理论知识和实际应用,在学习过程中可以帮助初学者更好地理解数据结构的本质和实际应用场景。 学习路径 数据结构理论 在本教程中,我们首先介绍了数据结构的几种基本分类和常用的数据结构,包括数组、链表、栈、队列、堆、树、图等等…

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的建立实例

    下面是Python数据结构之二叉树的建立实例的完整攻略。 一、二叉树的概念 二叉树是一种常用的树形结构,它由一组父子关系组成,其中每个节点都最多有两个子节点。通常我们认为,一个二叉树的根节点是唯一的,它没有父节点,而叶子节点则没有子节点。在二叉树中,节点的左子树和右子树可以为空。 二、二叉树的遍历 二叉树的遍历是指访问二叉树中所有节点的操作,它分为三种不同的…

    数据结构 2023年5月17日
    00
  • nginx内存池源码解析

    Nginx内存池源码解析 Nginx是一个高性能、高并发的Web服务器。为了提高其性能和速度,Nginx采用了特殊的内存管理机制,即内存池。 什么是内存池? 内存池是一种高效的内存分配和管理机制。它将一块内存划分成多个大小相等的块,并按需分配给系统。当内存块不再使用时,它并不被立即释放,而是留在内存池中待重复利用。 Nginx内存池结构 Nginx内存池主要…

    数据结构 2023年5月17日
    00
  • python数据结构树和二叉树简介

    下面是关于“Python数据结构树和二叉树简介”的详细攻略。 一、树的概念 树(Tree)是一种非常重要的数据结构,它是由n(n>0)个有限节点组成一个具有层次关系的集合。其中一个节点被称作根节点,它没有父节点;除根节点外,其他节点都有且只有一个父节点;每个节点可以有0个或多个子节点。一棵树的深度为树中层次最大的节点层数,根节点层次为1。 二、二叉树的…

    数据结构 2023年5月17日
    00
  • 使用C语言构建基本的二叉树数据结构

    下面是使用C语言构建二叉树数据结构的步骤和示例: 1. 定义二叉树结构体类型 定义一个二叉树的结构体,包含节点值、左右子节点等信息: typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; 2. 实现创建二叉树的函数 实现一个函…

    数据结构 2023年5月17日
    00
  • C语言植物大战数据结构二叉树递归

    C语言植物大战数据结构二叉树递归攻略 什么是二叉树? 二叉树是一种树形结构,每个节点最多只能有两个子节点。这两个子节点被称为左子树和右子树。二叉树具有自己的结构,因此它们也适合表示具有层次结构的数据。 什么是递归? 递归是一种算法的编写技巧,通过自己来定义自己的方法,以达到解决问题的目的。递归算法把复杂的问题简单化,但是也存在着可能导致程序无限递归的风险。 …

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