基础数据结构 -- 队列

news2024/12/24 9:22:00

1. 简介

        Java中的数据结构队列(Queue)是一种线性表,其特殊之处在于它只允许在表的后端进行插入操作,在表的前端进行删除操作。这种先进先出(FIFO,First In First Out)的结构类似于现实生活中的排队,最早等待的人将最先得到服务。

2. 特点

        队列的特点特别简单,先进先出

2.1 分类

  • 单向队列(Queue):只能在一端插入数据,在另一端删除数据。
  • 双向队列(Deque):每一端都可以进行插入数据和删除数据操作。
  • 优先级队列(PriorityQueue):数据项按照关键字排序,关键字最小(或最大)的数据项通常位于队列最前面。

2.2 图解

        栈的主要功能也很简单,无非就是队列的操作包括入队(add/offer)、出队(poll/remove)、查看队头元素(peek/element)。由于这种限制,队列中元素的移除顺序与添加顺序相想通,体现了先进先出的特性。

实现的基本方式:

  • 顺序存储结构:使用数组实现的顺序队列需要维护一个队尾指针,并注意处理数组边界溢出的问题,通常通过循环队列的方式来优化。
  • 链式存储结构:链式队列使用链表实现,每个节点包含数据和指向下一个节点的指针,这种结构可以灵活地处理队列的扩展和收缩。

2.2 结构

        java中的队列,几乎都与Collection有关。使用队列时可以通过ArrayList和LinkedList等数据结构去实现,也是给足了选择性。

Queue

Deque

PriorityQueue

 jdk中的接口也很简洁

Queue

 Deque

 PriorityQueue

主要的三个常用功能:

boolean add(E e); / boolean offer(E e);
将元素添加到队列末尾,若添加成功则返回true。
E poll(); / E remove();
从队首删除并返回该元素。
E peek(); / E element();
返回队首元素,但不删除。

2.3 使用

2.3.1 Queue

public class QueueTest {
    public static void main(String[] args) {
        // 创建一个队列
        Queue<Integer> queue = new LinkedList<>();

        // 向队列中添加元素
        queue.add(1);
        queue.add(2);
        queue.add(3);

        // 查看队列头部元素
        System.out.println("队列头部元素:" + queue.peek());

        // 从队列中删除元素
        System.out.println("出队元素:" + queue.poll());

        // 遍历队列中的元素
        System.out.println("队列中的元素:");
        for (Integer element : queue) {
            System.out.println(element);
        }
    }
}


// 结果
队列头部元素:1
出队元素:1
队列中的元素:
2
3

2.3.2 Deque

public class QueueTest {
    public static void main(String[] args) {
        // 创建一个栈
        Deque<Integer> queue = new ArrayDeque<>();

        // 向栈中添加元素
        queue.push(1);
        queue.push(2);
        queue.push(3);

        // 查看栈顶元素
        System.out.println("栈顶元素:" + queue.peek());

        // 从栈中删除元素
        System.out.println("出栈元素:" + queue.pop());

        // 遍历栈中的元素
        System.out.println("栈中的元素:");
        for (Integer element : queue) {
            System.out.println(element);
        }
    }
}

// 结果
栈顶元素:3
出栈元素:3
栈中的元素:
2
1

2.3.3 PriorityQueue

public class PriorityQueueTest {
    public static void main(String[] args) {
        // 创建一个优先队列
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

        // 向优先队列中添加元素
        priorityQueue.add(3);
        priorityQueue.add(1);
        priorityQueue.add(2);

        // 查看优先队列头部元素
        System.out.println("优先队列头部元素:" + priorityQueue.peek());

        // 从优先队列中删除元素
        System.out.println("出队元素:" + priorityQueue.poll());

        // 遍历优先队列中的元素
        System.out.println("优先队列中的元素:");
        for (Integer element : priorityQueue) {
            System.out.println(element);
        }
    }
}

// 结果
优先队列头部元素:1
出队元素:1
优先队列中的元素:
2
3

3. 用途

  • 消息处理与任务排队
    • 异步处理:当消息或任务处理时间较长时,使用队列可以避免因长时间等待而造成的用户界面冻结或响应延迟。
    • 生产者-消费者问题:在多线程环境中,队列可以用作生产者和消费者之间的缓冲区,生产者将数据入队,消费者从队列中取出数据进行处理。
  • 数据结构和算法实现
    • 广度优先搜索(BFS):在图算法中,队列用于实现BFS,以逐层访问节点的方式遍历图结构。
  • 网络请求管理
    • 请求缓存:服务器端可以使用队列来缓存和管理来自客户端的请求,以便按接收顺序进行处理。
  • 缓存系统
    • 数据缓冲:队列用于临时存储数据,平衡读写操作,提高系统的响应速度和吞吐量。
  • 游戏开发
    • 玩家动作排队:在游戏中,玩家的动作可以排队处理,确保游戏的公平性和逻辑正确性。
  • 日志记录
    • 日志排序:应用程序使用队列来收集日志信息,确保日志按照产生的顺序被记录和处理。

4. 总结

        Java中的队列是一种遵循先进先出(FIFO)原则的数据结构,与栈的后进先出(LIFO)特性形成对比。队列在Java的集合框架中具有重要地位,广泛应用于各种数据处理场景,如任务调度、缓冲数据等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性回归例子, 学习笔记[机械学习]

参考书籍, [pythonによる機械学習入門] y ax b # 直线的线性回归 import numpy as np import matplotlib.pyplot as plt # 求最小二乘法的回归直线,用到的库 from sklearn import linear_model# x 和 y的单点图 x np.random.rand(100, 1) x x*4-2 y 3*x-2 # 增加一部分乱…

Django路由与会话深度探索:静态、动态路由分发,以及Cookie与Session的奥秘

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

Llama模型家族之使用 ReFT技术对 Llama-3 进行微调(三)为 ReFT 微调准备模型及数据集

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

html--宇航员404

<!doctype html> <html> <head> <meta charset"utf-8"> <title>太空404</title><style> html {margin: 0;padding: 0;background-color: white; }body, html {width: 100%;height: 100%;overflow: hidden; }#svgContainer…

【设计模式】行为型设计模式之 职责链模式,探究过滤器、拦截器、Mybatis插件的底层原理

一、介绍 职责链模式在开发场景中经常被用到&#xff0c;例如框架的过滤器、拦截器、还有 Netty 的编解码器等都是典型的职责链模式的应用。 标准定义 GOF 定义&#xff1a;将请求的发送和接收解耦&#xff0c;让多个接收对象都有机会处理这个请求&#xff0c;将这些接收对象…

Leetcode1161. 最大层内元素和

Every day a Leetcode 题目来源&#xff1a;1161. 最大层内元素和 解法1&#xff1a;层序遍历 每次以「层」为单位进行拓展&#xff0c;统计该层的元素和&#xff0c;维护处理过程中的最大值层数和&#xff0c;以及层深度。 代码&#xff1a; /** lc appleetcode.cn id116…

高通开发系列 - 制作非root用户权限的debian镜像

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述环境配置制作Debian base文件系统root权限构建Debian文件系统非root权限制作Debian文件系统制作image并运行概述…

Objective-C 学习笔记 | 基础

Objective-C 学习笔记 | 基础 参考书&#xff1a;《Objective-C 编程&#xff08;第2版&#xff09;》 第1部分 入门 Objective-C语言是以C语言为基础的&#xff0c;但增加了对面向对象编程的支持。Objective-C语言是用来开发在苹果iOS以及OS X操作系统上运行的应用的编程语…

算法导论实战(三)(算法导论习题第二十五、二十六章)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;算法启示录 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 第二十五章 25.1-10 25.2-5 25…

C++ | Leetcode C++题解之第140题单词拆分II

题目&#xff1a; 题解&#xff1a; class Solution { private:unordered_map<int, vector<string>> ans;unordered_set<string> wordSet;public:vector<string> wordBreak(string s, vector<string>& wordDict) {wordSet unordered_set(w…

【Jenkins】Jenkins - 节点

选择系统设置 - 节点设置 -添加节点 下载对应的 jar包 &#xff0c;执行命令 测试运行节点生效 1. 创建测试项目 test1 2. 选择节点执行&#xff1a; 在配置页面的“General”部分&#xff0c;找到“限制项目的运行节点”&#xff08;Restrict where this project can be run…

Kali Linux 2024.2 释出

渗透测试发行版 Kali Linux 释出了最新的 2024.2。 主要新特性包括&#xff1a;桌面环境更新到 GNOME 46&#xff0c;Xfce 环境加入 HiDPI 模式&#xff0c;更新了网络侦察工具 AutoRecon&#xff0c;监视 Linux 进程的命令行工具 pspy&#xff0c;提取和显示 CVE 信息的 Splo…

现代密码学-基础

安全业务 保密业务&#xff1a;数据加密 认证业务&#xff1a;保证通信真实性 完整性业务&#xff1a;保证所接收的消息未经复制、插入、篡改、重排或重放 不可否认业务&#xff1a;防止通信双方的某一方对所发消息的否认 访问控制&#xff1a;防止对网络资源的非授权访问&…

Mysql使用中的性能优化——索引数对INSERT性能的影响

表的索引可以给数据检索提升效率&#xff0c;但是也给表的增删改操作带来代价。本文我们将关注&#xff0c;索引数量对INSERT操作的影响。 结论 索引数的新增会造成INSERT操作效率下降&#xff0c;约每增一个索引会降低10%效率。 实验数据 可以看到0个索引的效率是7个索引效…

12-C语言的内存管理

12-C语言的内存管理 文章目录 12-C语言的内存管理一、C语言进程的内存布局1.1 程序与进程1.2 虚拟内存与物理内存1.2.1 虚拟内存布局 二、栈空间的特点与管理三、静态变量3.1 全局静态变量3.2 局部静态变量3.3 为什么需要静态变量&#xff1f; 四、数据段与代码段4.1 数据段4.2…

VSCode数据库插件

Visual Studio Code (VS Code) 是一个非常流行的源代码编辑器&#xff0c;它通过丰富的插件生态系统提供了大量的功能扩展。对于数据库操作&#xff0c;VS Code 提供了几种插件&#xff0c;其中“Database Client”系列插件是比较受欢迎的选择之一&#xff0c;它包括了对多种数…

Django 连接mysql数据库配置

1&#xff0c;提前创建注册的app1应用 Test/Test/settings.py python manage.py startapp app1 2&#xff0c;配置mysql数据库连接 Test/Test/settings.py DATABASES {default: {ENGINE: django.db.backends.mysql,# 数据库名字NAME: db1,# 连接mysql数据库用户名USER: ro…

力扣 240.搜素矩阵II

题目描述&#xff1a; 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9…

【自动部署】4.阿里云ECS服务器 IDEA自动部署项目

如何在IDEA中,自动部署项目到阿里云ECS服务器?今天我们就来实现一键部署功能。 执行maven命令打包免密登录,在IEDA中连接服务器执行stop服务上传jar包到服务器执行start脚本查看运行日志1.安装Alibaba Cloud Toolkit 2.配置host 3.自动化部署后端 右击项目,选择Alibaba CL…

Java Web学习笔记28——Element案例

案例&#xff1a; 根据页面原型完成员工管理页面开发&#xff0c;并通过Axios完成数据异步加载。 服务端数据获取地址&#xff0c;也就是API接口。 这个URL返回的是JSON格式的数据。 表格就是把JSON格式的数据渲染显示在页面中。 页面分为三个部分: 页头&#xff1a; 菜单…