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

article/2025/7/15 1:19:02

一、基本原理

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

(一) 核心操作

  • 入队(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.hkcw.cn/article/kunsmcHlyY.shtml

相关文章

windows下安装docker、dify、ollama

一、docker安装 镜像源配置 {"builder": {"gc": {"defaultKeepStorage": "10GB","enabled": true}},"experimental": true,"registry-mirrors": ["https://docker.m.daocloud.io","ht…

mysql隐式转换会造成索引失效的原因

现在我们看一个例子 比如现在我有一张表叫做test 涉及的字段有id code name age address id 是int数值类型 code 是varchar字符串类型 name 是varchar字符串类型 age是int 数值类型 address是varchar 字符串类型 创建语句&#xff1a; CREATE TABLE test ( id INT …

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程

Rainbond V6 国产化部署教程&#xff0c;针对鲲鹏 CPU 麒麟 V10 的离线环境&#xff0c;手把手教你从环境准备到应用上线&#xff0c;所有依赖包提前打包好&#xff0c;步骤写成傻瓜式操作指南。别说技术团队了&#xff0c;照着文档一步步来&#xff0c;让你领导来都能独立完成…

Python训练营---Day40

知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封装在函数中展平操作&#xff1a;除第一个维度batchsize外全部展平dropout操作&#xff1a;训练阶段随机丢弃神经元&#xff0c;测试阶段eval模式关闭dropout 作业&#xff1a;仔细学习下测试和训练代码…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

C++八股 —— 手撕线程池

文章目录 一、背景二、线程池实现1. 任务队列和工作线程2. 构造和析构函数3. 添加任务函数4. 完整代码 三、阻塞队列实现1. 基础队列2. 升级版队列 四、测试代码五、相关问题六、其他实现方式 来自&#xff1a;华为C一面&#xff1a;手撕线程池_哔哩哔哩_bilibili 华为海思&am…

半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司

半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司 半导体厂房的设计建造是一项高度复杂、专业性极强的系统工程&#xff0c;涉及洁净室、微振动控制、电磁屏蔽、特殊气体/化学品管理等关键技术。 一、设计建造流程&#xff1a; 1.需求定义与可行性分析 &a…

gitLab 切换中文模式

点击【头像】--选择settings 选择【language】,选择中文&#xff0c;点击【保存】即可。

Redis 常用数据结构详解与实战应用

在当今互联网高速发展的时代&#xff0c;数据的存储和处理效率至关重要。Redis 作为一款高性能的内存数据库&#xff0c;凭借其丰富的数据结构和出色的性能&#xff0c;成为了众多开发者的首选。本文将深入探讨 Redis 常用的数据结构&#xff0c;并结合实际应用场景&#xff0c…

leetcode2221. 数组的三角和-medium

1 题目&#xff1a;数组的三角和 官方标定难度&#xff1a;中 给你一个下标从 0 开始的整数数组 nums &#xff0c;其中 nums[i] 是 0 到 9 之间&#xff08;两者都包含&#xff09;的一个数字。 nums 的 三角和 是执行以下操作以后最后剩下元素的值&#xff1a; nums 初始…

PPIO × AstrBot:多平台接入聊天机器人,开启高效协同 | 教程

在消息平台接入专属聊天机器人&#xff0c;能快速生成精准答案&#xff0c;与项目管理、CRM等系统集成后&#xff0c;机器人还能根据任务进展自动建群、推送进度提醒&#xff0c;并精准相关人员&#xff0c;实现信息的高效传递。 AstrBot 是一个多平台聊天机器人及开发框架&…

江科大SPI串行外设接口hal库实现

hal库相关函数 初始化结构体 typedef struct {uint32_t Mode; /*SPI模式*/uint32_t Direction; /*SPI方向*/uint32_t DataSize; /*数据大小*/uint32_t CLKPolarity; /*时钟默认极性控制CPOL*/uint32_t CLKPhase; /*…

【笔记】Suna 部署之获取 OpenAI API key

#工作记录 API Platform | OpenAI 一、注册或登录 OpenAI 账号 访问 OpenAI 官方网站&#xff08;platform.openai.com &#xff09;。若已有 ChatGPT 账号&#xff0c;可直接使用该账号登录。若无账号&#xff0c;点击注册&#xff08;Sign Up&#xff09;&#xff0c;填写有…

Java八股文——Java基础「概念篇」

参考小林Coding和Java Guide 说一下Java的特点 平台无关性&#xff1a;“Write Once, Run Anywhere”其最大的特点之一。Java编译器将源代码编译成字节码&#xff0c;该字节码可以在任何安装了JVM的系统上运行。面向对象&#xff1a;Java是一门严格的面向对象编程语言&#xf…

NHANES指标推荐:CQI

文章题目&#xff1a;The impact of carbohydrate quality index on menopausal symptoms and quality of life in postmenopausal women 中文标题&#xff1a;碳水化合物质量指数对绝经后妇女更年期症状和生活质量的影响 发表杂志&#xff1a;BMC Womens Health 影响因子&…

91.评论日记

2025年5月30日20:27:06 AI画减速器图纸&#xff1f; 呜呜为什么读到机械博士毕业了才有啊 | 新迪数字2025新品发布会 | AI工业软件 | 三维CAD | 国产自主_哔哩哔哩_bilibili

循环神经网络(RNN)全面教程:从原理到实践

循环神经网络(RNN)全面教程&#xff1a;从原理到实践 引言 循环神经网络(Recurrent Neural Network, RNN)是处理序列数据的经典神经网络架构&#xff0c;在自然语言处理、语音识别、时间序列预测等领域有着广泛应用。本文将系统介绍RNN的核心概念、常见变体、实现方法以及实际…

OrCAD X Capture CIS 设计小诀窍第二季 | 10. 如何自动将 270° 放置的网络名称修正为 90°

背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要统一原理图的格式&#xff0c;从而保证原理图的美观和统一。而通过把所有270放置的网络名称修正为90可以避免因网络名称放置的方向不一致而造成混淆&#xff0c;比如6和9。但如果依靠设计师手动进行修改&#x…

核心机制:确认应答和超时重传

核心机制一:确认应答 实现让发送方知道接受方是否收到数据 发送方发送了数据之后,接受方,一旦接收到了,就会给发送方返回一个"应答报文"告诉发送方"我已经收到了数据" 网络上会出现"后发先至"的情况 为了解决上述问题,就引入了"序号和确…

特朗普:仍希望有国际学生在美国学习

当地时间5月30日,美国总统特朗普在白宫表示,仍希望有国际学生在美国学习。据美国政治新闻网站“Politico”27日的报道,特朗普政府已暂停新的学生签证面谈,同时考虑扩大对国际学生社交媒体审查范围。此外,据路透社30日援引一份美国国务卿发送给所有美国外交和领事馆的电报称…