数据结构之队列:原理与应用

一、基本原理

  • 队列是一种特殊的线性表
  • 队列是一个有序表(可以用数组或链表实现)
  • 遵循“先来先服务”的原则,它只允许在表的前端(队头)进行删除操作,在表的后端(队尾)进行插入操作

(一) 核心操作

  • 入队(Enqueue):在队尾添加元素。
  • 出队(Dequeue):从队头移除元素。
  • 查看队头(Front):获取队头元素但不移除。
  • 判空(IsEmpty):检查队列是否为空。

队列的逻辑结构类似于现实中的排队场景,例如超市收银或银行叫号系统,先到达的顾客优先服务。

(二) 代码示例

import java.util.LinkedList;
import java.util.Queue;public class Main {public static void main(String[] args) {// 创建一个队列Queue<Integer> queue = new LinkedList<>();// 入队queue.offer(10);queue.offer(20);System.out.println("队列大小: " + queue.size());// 输出 2// 出队int front = queue.poll();System.out.println("出队元素: " + front);  // 输出 10// 查看队列的头元素但不移除它int peek = queue.peek();System.out.println("队列头元素: " + peek);  // 输出 20// 检查队列是否为空boolean isEmpty = queue.isEmpty();System.out.println("队列是否为空: " + isEmpty);  // 输出 false}
}public interface Queue<E> extends Collection<E> {//插入元素,成功返回true,失败抛出异常boolean add(E e);//插入元素,成功返回true,失败返回false或抛出异常 boolean offer(E e);//取出并移除头部元素,空队列抛出异常 E remove();//取出并移除头部元素,空队列返回null E poll();//取出但不移除头部元素,空队列抛出异常 E element();//取出但不移除头部元素,空队列返回null E peek();//删除并返回队头元素,当队列为空,则会阻塞等待E take();
}

二、基本类型

  1. 双端队列(Deque)
    • 支持在队头和队尾同时进行插入和删除操作,灵活性更高。
  1. 优先队列(Priority Queue)
    • 元素按优先级出队,而非顺序,适用于任务调度等需要优先级处理的场景。
  1. 阻塞队列
    • 在队列为空时,出队操作阻塞;在队列满时,入队操作阻塞,适用于多线程同步场景。

三、实现方式

队列的实现主要有两种方式,各自适用于不同场景:

  1. 数组实现(顺序队列)
    • 特点:使用固定大小的数组存储元素,通过两个指针(frontrear)分别标记队头和队尾。
    • 问题:当rear指针到达数组末尾时,若队头有空闲位置,无法直接利用,导致“假溢出”。
    • 优化方案:引入循环队列,通过模运算实现指针的循环移动,从而高效利用数组空间。
  1. 链表实现(链式队列)
    • 特点:使用动态链表存储元素,无需预先分配固定大小,通过两个指针(headtail)分别指向队头和队尾。
    • 优势:空间利用率高,适合元素数量不确定或动态变化的场景。

四、复杂度分析

  • 时间复杂度
    • 入队(Enqueue):O(1)(数组和链表实现均高效)。
    • 出队(Dequeue):O(1)(链表实现直接操作头节点;数组实现需移动指针,但循环队列优化后仍为O(1))。
  • 空间复杂度
    • 数组实现:固定大小,可能浪费空间或溢出。
    • 链表实现:动态分配,空间利用率高,但需额外指针存储空间。

五、应用场景

队列在计算机科学和实际工程中具有广泛应用,以下是一些典型场景:

  1. 任务调度与资源管理
    • 操作系统进程调度:CPU按照队列顺序执行进程,确保公平性。
    • 打印机任务队列:用户提交的打印任务按顺序处理,避免混乱。
  1. 消息传递与缓冲区管理
    • 网络数据包处理:接收到的数据包按顺序进入队列,由处理器按顺序处理,确保数据完整性。
    • 生产者-消费者模型:生产者将数据放入队列,消费者从队列中取出数据,实现解耦和异步处理。
  1. 算法与系统设计
    • 广度优先搜索(BFS):使用队列逐层遍历图的节点,确保按层次访问。
    • Web服务器请求处理:客户端请求按顺序进入队列,服务器按顺序响应,避免过载。
  1. 异步通信与事件处理
    • 即时通讯应用:如WhatsApp在用户离线时,消息暂存于队列,待用户上线后按顺序接收。
    • GUI事件处理:用户操作事件按顺序进入队列,由事件循环按顺序处理。

六、优缺点

  • 优点
    • 逻辑简单,易于实现。
    • 保证元素顺序处理,适用于需要公平性的场景。
  • 缺点
    • 数组实现需预先分配空间,可能浪费或不足。
    • 中间插入或删除效率低(需移动大量元素),但队列通常不涉及此类操作。

七、参看资料

Java 中常用队列用法详解 - 技术栈

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

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

相关文章

Ubuntu 安装 Miniconda 及配置国内镜像源完整指南

目录 Miniconda 安装Conda 镜像源配置Pip 镜像源配置验证配置基本使用常见问题 1. Miniconda 安装 1.1 下载安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 执行安装 bash Miniconda3-latest-Linux-x86_64.sh按回车查看许可协议…

PYTHON通过VOSK实现离线听写支持WINDOWSLinux_X86架构

在当今人工智能快速发展的时代&#xff0c;语音识别技术已经成为人机交互的重要方式之一。本文将介绍如何使用Python结合Vosk和PyAudio库实现一个离线语音识别系统&#xff0c;无需依赖网络连接即可完成语音转文字的功能。 技术栈概述 1. Vosk语音识别引擎 Vosk是一个开源的…

【Java进阶】图像处理:从基础概念掌握实际操作

一、核心概念&#xff1a;BufferedImage - 图像的画布与数据载体 在Java图像处理的世界里&#xff0c;BufferedImage是当之无愧的核心。你可以将它想象成一块内存中的画布&#xff0c;所有的像素数据、颜色模型以及图像的宽度、高度等信息都存储在其中。 BufferedImage继承自…

数据治理系统是什么?数据治理工具有什么用?

目录 一、数据治理系统是什么&#xff1f; 二、数据治理系统的重要性 1. 保障数据质量 2. 确保数据安全 3. 促进数据共享与协作 三、常见的数据治理工具及其特点 1. 数据质量管理工具 2. 数据集成工具 3. 元数据管理工具 四、数据治理工具有哪些作用&#xff1f; 1.…

消息队列-kafka为例

目录 消息队列应用场景和基础知识MQ常见的应用场景MQ消息队列的两种消息模式如何保证消息队列的高可用&#xff1f;如何保证消息不丢失&#xff1f;如何保证消息不被重复消费&#xff1f;如何保证消息消费的幂等性&#xff1f;重复消费的原因解决方案 如何保证消息被消费的顺序…

C++17常量

nullptr nullptr出现的目的是为了替代NULL。在某种意义上来说&#xff0c;传统会把NULL,0视为同一种东 西&#xff0c;这取决于编译器如何定义NULL&#xff0c;有些编译器会将定义为((void*)0)&#xff0c;有些则会直接将其定义 为0。 C不允许直接将void*隐式转换到其他类型。…

计算机网络学习(九)——CDN

一、CDN CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种通过分布式节点将内容更高效地传递给用户的技术架构&#xff0c;广泛应用于加速网站、视频、下载、直播等业务。 CDN 是把内容放到离用户最近的“高速公路入口”&#xff0c;提升访…

Elasticsearch的写入流程介绍

Elasticsearch 的写入流程是一个涉及 分布式协调、分片路由、数据同步和副本更新 的复杂过程,其设计目标是确保数据一致性、可靠性和高性能。以下是写入流程的详细解析: 一、写入流程总览 二、详细步骤解析 1. 客户端请求路由 请求入口:客户端(如 Java 客户端、REST API)…

vue为什么点击两遍才把参数传递过去

先说一下场景&#xff0c;就是我把云服务器这个下拉选择框分别初始化之后&#xff0c;然后点击新建权限然后就打开了右侧的抽屉式的对话框&#xff0c;页面上那个文字信息是传递过来了。那个是正确的&#xff0c;但是我请求接口的时候&#xff0c;发现请求的接口的参数总是要慢…

java代码性能优化

刷题过程中遇到的一些时间复杂度相同&#xff0c;但是常数因子的差距导致的性能差距&#xff0c;遇到持续更新 枚举 VS contains 例如&#xff1a;判断一个字符是不是元音 法一&#xff1a; if(ch a || ch e || ch i || ch o || ch u) 法二&#xff1a; Set<Charact…

OpenGL Chan视频学习-9 Index Buffers inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再单独整理网站具体函数了&#xff0c;网站直接翻译会…

基于微服务架构的社交学习平台WEB系统的设计与实现

设计&#xff08;论文&#xff09;题目 基于微服务架构的社交学习平台WEB系统的设计与实现 摘 要 社交学习平台 web 系统要为学习者打造一个开放、互动且社交性强的在线教育环境&#xff0c;打算采用微服务架构来设计并实现一个社交学习平台 web 系统&#xff0c;以此适应学…

生成式人工智能:重构软件开发的范式革命与未来生态

引言 生成式人工智能&#xff08;GenAI&#xff09;正以颠覆性力量重塑软件开发的底层逻辑。从代码生成到业务逻辑设计&#xff0c;从数据分析到用户交互&#xff0c;GenAI通过其强大的推理能力与场景适应性&#xff0c;将传统开发流程的“复杂工程”转化为“敏捷实验”&#…

C++17原生测试编程实践:现代特性与分支覆盖指南

C17原生测试编程实践&#xff1a;现代特性与分支覆盖指南 概述 本文将深入探讨如何利用C17新特性进行原生测试代码编写&#xff0c;实现完全分支覆盖。我们将不依赖任何外部测试框架&#xff0c;而是使用C17标准库构建完整的测试解决方案。 一、C17测试核心工具集 1. 断言工…

RK3568项目(四)--uboot启动流程之启动模式选择

目录 一、引言 二、芯片初始化 ------>2.1、io_domain ------>2.2、调频调压 ------>2.3、控制台初始化 三、平台初始化 ------>3.1、设置mac地址 ------------>3.1.1、vendor分区 ------>3.2、设置serialno ------>3.3、设置下载模式 -------…

Kotlin JVM 注解详解

前言 Kotlin 作为一门现代 JVM 语言&#xff0c;提供了出色的 Java 互操作性。为了更好地支持与 Java 代码的交互&#xff0c;Kotlin 提供了一系列 JVM 相关注解。这些注解不仅能帮助我们控制 Kotlin 代码编译成 Java 字节码的行为&#xff0c;还能让我们的 Kotlin 代码更好地…

Starrocks 物化视图的实现以及在刷新期间能否读数据

背景 本司在用Starrocks做一些业务上的分析的时候&#xff0c;用到了物化视图&#xff0c;并且在高QPS的情况下&#xff0c;RT也没有很大的波动&#xff0c;所以在此研究一下Starrock的实现&#xff0c;以及在刷新的时候是不是原子性的 本文基于Starrocks 3.3.5 结论 Starro…

[网页五子棋][对战模块]前后端交互接口(建立连接、连接响应、落子请求/响应),客户端开发(实现棋盘/棋子绘制)

文章目录 约定前后端交互接口建立连接建立连接响应针对"落子"的请求和响应 客户端开发实现棋盘/棋子绘制部分逻辑解释 约定前后端交互接口 对战模块和匹配模块使用的是两套逻辑&#xff0c;使用不同的 websocket 的路径进行处理&#xff0c;做到更好的耦合 建立连接 …

电工基础【2】自锁、互锁、正反转电路

04 自锁、正反转电路 我们讲一下这个自锁和正反转。 自锁电路图示例图 加了一个这个 KM1 自锁。加了 KM1 的辅助触头&#xff0c;它怎么实现呢&#xff1f;它怎么就自锁了呢&#xff1f;没加它的时候为什么是点动&#xff1f;加它为什么自锁&#xff1f; 讲解一下。首先我们…

TypeScript 中感叹号(!)两种位置用法

这是一个非常好的问题&#xff01; 在 TypeScript 中&#xff0c;感叹号&#xff08;!&#xff09;有两种位置用法&#xff0c;它们含义完全不同&#xff1a; ✅ 一、后置感叹号 !&#xff08;非空断言&#xff09; process.env.ADMIN_PRIVATE_KEY! ✅ 作用&#xff1a; 告…