C# 中 Queue 学习笔记

news/2025/10/31 11:25:36/文章来源:https://www.cnblogs.com/LunaNorth/p/19179272

1️⃣ 基础概念与用法

🔹 什么是 Queue?

Queue(队列) 是一种“先进先出”(FIFO — First In, First Out)的数据结构。你可以把它想象成排队买票的队伍:第一个来的排在最前面,最后一个来的排在最后面;服务时也是从最前面开始。

在 C# 中,Queue<T> 是位于 System.Collections.Generic 命名空间中的泛型集合类,用于存储同类型对象的有序集合。


🔹 如何定义一个 Queue?

using System;
using System.Collections.Generic;// 创建一个存储字符串的队列
Queue<string> queue = new Queue<string>();// 或者创建一个存储整数的队列
Queue<int> numberQueue = new Queue<int>();

小贴士T 表示泛型类型,你可以替换为任何数据类型(如 int, string, Person 等)。


🔹 常用方法一览

方法名 功能说明
Enqueue(T) 将元素添加到队列末尾
Dequeue() 移除并返回队列开头的元素
Peek() 返回队列开头的元素(不移除)
Count 获取当前队列中元素数量
Clear() 清空队列
Contains(T) 检查是否包含指定元素

🔹 简单示例:模拟排队买票

using System;
using System.Collections.Generic;class Program
{static void Main(){Queue<string> ticketQueue = new Queue<string>();// 排队入场ticketQueue.Enqueue("张三");ticketQueue.Enqueue("李四");ticketQueue.Enqueue("王五");Console.WriteLine($"当前排队人数:{ticketQueue.Count}");// 开始服务while (ticketQueue.Count > 0){string customer = ticketQueue.Dequeue();Console.WriteLine($"正在服务:{customer}");}Console.WriteLine("所有顾客已服务完毕!");}
}

输出结果:

当前排队人数:3
正在服务:张三
正在服务:李四
正在服务:王五
所有顾客已服务完毕!

💡 重点记忆

  • Enqueue → 加入队尾
  • Dequeue → 取出队头(并移除)
  • Peek → 查看队头(不移除)

2️⃣ 进阶知识点

🔹 与其他集合的区别

集合类型 特点 适用场景
Queue<T> FIFO(先进先出) 任务调度、消息队列
Stack<T> LIFO(后进先出) 撤销操作、括号匹配
List<T> 可随机访问、动态数组 需要频繁增删改查
Dictionary<TKey, TValue> 键值对存储 快速查找、映射关系

🧠 记住口诀

  • Queue → 排队买票 → 先来先服务
  • Stack → 压栈弹栈 → 后进先出(像叠盘子)

🔹 性能特点

  • 插入(Enqueue) :O(1) —— 非常高效,直接加到尾部。
  • 删除(Dequeue) :O(1) —— 直接从头部移除。
  • 查找(Contains) :O(n) —— 需要遍历整个队列。
  • 访问特定位置元素:不支持直接索引访问(没有 queue[i])。

⚠️ 注意:如果你需要频繁查找或按索引访问元素,建议使用 List<T> 而不是 Queue<T>


🔹 线程安全问题

默认的 Queue<T> 不是线程安全的。如果多个线程同时读写同一个队列,可能会导致数据错误或异常。

✅ 解决方案:

  1. 手动加锁(推荐简单场景):
private static readonly object _lock = new object();lock (_lock)
{queue.Enqueue(item);
}lock (_lock)
{if (queue.Count > 0)item = queue.Dequeue();
}
  1. 使用线程安全的 ConcurrentQueue<T> (推荐多线程场景):
using System.Collections.Concurrent;ConcurrentQueue<string> threadSafeQueue = new ConcurrentQueue<string>();
threadSafeQueue.Enqueue("用户A");
threadSafeQueue.TryDequeue(out string user); // 安全取出

📌 推荐:在多线程环境中优先使用 ConcurrentQueue<T>,它是专门为并发设计的。


3️⃣ 实际工作中的使用场景

🔹 场景一:任务调度系统

比如一个后台服务需要处理大量用户请求,可以将请求放入队列,由工作线程逐个处理。

Queue<Request> requestQueue = new Queue<Request>();// 用户提交请求
requestQueue.Enqueue(new Request { UserId = 1, Action = "支付" });// 工作线程处理
while (requestQueue.Count > 0)
{var req = requestQueue.Dequeue();ProcessRequest(req);
}

🎯 优点:保证请求按顺序处理,避免资源竞争。


🔹 场景二:消息队列 / 事件总线

在解耦系统模块时,常用队列传递消息或事件。

Queue<EventMessage> eventQueue = new Queue<EventMessage>();// 发布事件
eventQueue.Enqueue(new EventMessage { Type = "UserLogin", Data = "user123" });// 订阅者消费
while (eventQueue.Count > 0)
{var msg = eventQueue.Dequeue();HandleEvent(msg);
}

🔄 适合微服务、插件架构、事件驱动系统。


🔹 场景三:广度优先搜索(BFS)算法

在图或树的遍历中,Queue 是实现 BFS 的核心结构。

Queue<Node> bfsQueue = new Queue<Node>();
bfsQueue.Enqueue(rootNode);while (bfsQueue.Count > 0)
{Node current = bfsQueue.Dequeue();foreach (Node child in current.Children){bfsQueue.Enqueue(child);}
}

🧩 常见于路径查找、社交网络好友推荐、游戏地图寻路等。


🔹 场景四:打印任务队列

打印机管理系统中,多个文档按提交顺序打印。

Queue<Document> printQueue = new Queue<Document>();
printQueue.Enqueue(new Document { Name = "合同.pdf" });
printQueue.Enqueue(new Document { Name = "发票.docx" });while (printQueue.Count > 0)
{var doc = printQueue.Dequeue();PrintDocument(doc);
}

🖨️ 保证打印顺序,避免混乱。


📌 总结与学习建议

核心要点回顾

  • Queue 是 先进先出 结构,适用于顺序处理场景。
  • 主要方法:Enqueue, Dequeue, Peek, Count
  • 不支持索引访问,查找效率低。
  • 多线程需使用 ConcurrentQueue<T> 或手动加锁。
  • 常用于任务调度、消息传递、BFS算法等。

🎯 学习建议

  1. 动手写几个小例子,比如模拟银行叫号、订单处理。
  2. 对比 Stack<T>Queue<T>,理解不同数据结构的应用差异。
  3. 在项目中尝试用 ConcurrentQueue<T> 替代普通 Queue<T>,体验线程安全的好处。

📘 附录:常用方法速查表

Queue<string> q = new Queue<string>();q.Enqueue("A");           // 添加到队尾
q.Dequeue();              // 移除并返回队头元素
q.Peek();                 // 查看队头元素(不移除)
q.Count;                  // 当前元素数量
q.Contains("A");          // 是否包含某元素
q.Clear();                // 清空队列

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

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

相关文章

Rust 异步错误处理与分布式系统中的实践策略

在异步编程和分布式系统中,Rust的错误处理面临着新的挑战:异步任务的生命周期管理、跨服务调用的错误传递、网络分区下的故障恢复等场景,都要求错误处理机制具备更强的上下文携带能力和更灵活的恢复策略。本文将聚焦…

2025年10月中型挖掘机租赁品牌榜:租赁成本与耐久性综合评测

2025年10月,全国土方工程进入传统赶工季,市政、地产、道路项目集中开工,中型挖掘机(20-29吨)成为租赁市场最紧俏的吨位段。用户普遍面临“租得到”与“租得值”双重焦虑:一方面,国四排放新规落地,老旧二手机型…

2025年10月挖掘机品牌推荐榜:迪万伦领衔全型号对比排行

如果您正计划在今年第四季度添置挖掘机,大概率正被“选哪家”困扰:工程方催得紧,预算卡得死,工地地质、海拔、温度差异大,既要考虑一次性购置成本,又得盘算油耗、维保、二手机残值。中国工程机械工业协会数据显示…

【Java】Bean的生命周期——print大法带你了解Bean的生命周期(初探)

今天面试被问到Bean的生命周期,我就巴拉巴拉说了5个步骤,最后反问阶段面试官说不够详细。今天就来实战梳理一下! 一、定义一个Student类 为了方便看到生命周期过程,我直接使用print大法; 另外,将类交给Spring容器…

基于containerd部署的k8s集群

关闭防火墙、selinux、关闭交换分区、配置hosts网上教程很多,就不一一描述,可自行网上查找。 主机清单系统K8S集群角色服务器主机名CentOS7.9 Master192.168.71.138masterCentOS7.9 Node1192.168.71.139node1CentOS7…

中国大陆Wi-Fi信道

中国大陆 Wi-Fi 信道 先总结一下,目前 WLAN 协议繁多甚至有点混乱,加之各国法规不同限制不同,甚至有些协议专为国家定制(例如802.11j), 导致很多频段使用并不是很明朗,目前中国大陆能够明确可以正常使用的 Wi-F…

AE脚本-MoBar v3.5.1 Win 可提高效率的AE快捷命令脚本工具箱

** 脚本简介** MoBar 是一个节省时间的工具集合,可帮助您在Adob​​e After Effects中快速轻松地创建项目。没有必要在工具之间徘徊,也不必担心事情会花费你多长时间。它旨在让您比以往更快、更高效地工作。 MoBar 配…

“数据筑基” 赋能 “人工智能+”:解构“十五五”新质生产力的核心路径

“十五五”规划建议的发布,不仅是未来五年的施政纲领,更是一份关乎中国经济“形态”与“质态”的深度诊断。当我们穿透“现代化产业体系”、“数字中国”等宏观布局,会发现一条贯穿始终的暗线:“新质生产力的全面唤…

详细介绍:Win11系统JAVA8与IDEA社区版下载安装与配置

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年最新推荐!搬家公司推荐排行榜 ,覆盖玄武秦淮等区域专业搬家公司精选榜单南京搬家公司推荐

引言 在南京,搬家需求逐年增长,但消费者在选择搬家公司时却屡屡碰壁。不少公司报价模糊,隐形消费层出不穷,让消费者额外花费冤枉钱;部分公司响应迟缓,预约后迟迟不上门,打乱客户搬家计划;还有些公司服务不专业…

Golang 镜像拉取与 Docker 部署全教程

Golang(简称 Go)是 Google 开发的静态类型编程语言,语法上借鉴了 C 语言的简洁性,但弥补了 C 语言的诸多痛点,比如自带垃圾回收(不用手动管理内存)、强类型安全(减少运行时错误)、原生支持并发(轻松处理高并…

2025年推拉棚供应商年度排名,推拉棚源头厂家/推拉棚制造商推荐

在当今各类户外场景应用中,如物流仓储、商业经营、市政设施等,推拉棚以其灵活便捷的特性,已成为不可或缺的户外设施。然而,市场上推拉棚制造商众多,质量与服务参差不齐。企业和个人在选择时,常面临产品耐用性不佳…

解析2025强网拟态EZMiniAPP

解析2025强网拟态EZMiniAPP微信小程序逆向分析与加密算法破解 一、题目背景与初步分析 1.1 题目描述 本题是一道Mobile类别的CTF挑战题,题目提供了一个文件:__APP__.wxapkg。 1.2 什么是wxapkg文件 .wxapkg是微信小程…

2025 年 10 月 UV 测量仪器/UV LED 配套设备/UV 光固化胶厂家推荐排行榜:专业选型指南与高效应用方案

2025 年 10 月 UV 测量仪器/UV LED 配套设备/UV 光固化胶厂家推荐排行榜:专业选型指南与高效应用方案 随着工业制造技术向精密化、智能化方向发展,紫外光技术应用领域持续扩大。在电子半导体、医疗设备、汽车制造等高…

2025年新疆电线电缆厂家权威推荐榜单:特种电缆/矿用电缆/电力电缆源头厂家精选

随着西部大开发和新能源产业建设的持续推进,新疆电线电缆市场需求呈现稳定增长态势。行业数据显示,2024年西北地区电线电缆市场规模已突破380亿元,其中新疆地区占比达35%,年均增长率保持在12%-15%。电线电缆技术重…

为什么顶级企业愿意为设计买单?

为什么顶级企业愿意为设计买单?在大众认知中,设计常被等同于 “视觉美化”,但劳斯莱斯、国际私人银行、高端医疗集团等顶级企业,愿意为设计支付数倍于普通方案的成本,核心并非追求 “好看”—— 而是因为设计对它…

sg.后台线程-1亿浮点运算用时-方法2

import PySimpleGUI as sg import math import time import threading # 改用标准库的 threading.Eventdef calculate_sqrt_sum(window, stop_event):"""后台计算函数"""total = 10_00…

2025 年混合机厂家最新推荐排行榜:高效盘条式无重力犁刀式锥形卧式螺带连续式等机型优选企业测评结果及核心优势解析

引言 为助力企业精准选购混合机设备,粉体设备行业协会联合专业测评机构开展 2025 年混合机品牌测评工作。本次测评覆盖全国 68 家主流混合机生产企业,采用 “技术实力 + 产品性能 + 服务质量 + 市场口碑” 四维评分体…

note 2

在《程序员修炼之道》“注重实效的途径” 章节中,DRY 原则(Dont Repeat Yourself)和正交性原则,为构建灵活可维护的系统提供了关键方法论。DRY 原则强调 “系统中的每一项知识都必须具有单一、无歧义、权威的表示”…

基于机载相控阵天线的卫星通信链路预算示例:(一) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …