news 2026/5/27 4:24:00

C#之队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#之队列

C# 队列(Queue)教程:从基础到实战

队列(Queue)是计算机科学中一种重要的数据结构,它遵循"先进先出"(FIFO)原则。在C#中,System.Collections.Queue类提供了队列的实现。本教程将全面介绍C#中队列的使用方法。

1. 队列的基本概念

队列是一种线性数据结构,具有以下特点:

  • 先进先出(FIFO):第一个进入队列的元素将是第一个被移除的元素
  • 两端操作:通常在队尾添加元素,在队首移除元素
  • 应用场景:任务调度、消息传递、广度优先搜索等

2. 创建队列

在C#中,可以使用Queue类来创建队列:

usingSystem;usingSystem.Collections;classProgram{staticvoidMain(){// 创建一个空队列Queuequeue=newQueue();// 使用泛型版本(推荐)Queue<string>stringQueue=newQueue<string>();}}

推荐使用泛型版本Queue<T>,因为它提供了类型安全性和更好的性能。

3. 基本操作

3.1 添加元素(Enqueue)

使用Enqueue方法向队列尾部添加元素:

Queue<string>tasks=newQueue<string>();tasks.Enqueue("任务1");tasks.Enqueue("任务2");tasks.Enqueue("任务3");

3.2 移除元素(Dequeue)

使用Dequeue方法移除并返回队列开头的元素:

stringfirstTask=tasks.Dequeue();// 返回"任务1"Console.WriteLine(firstTask);

3.3 查看队首元素(Peek)

使用Peek方法查看队列开头的元素但不移除它:

stringnextTask=tasks.Peek();// 返回"任务2"但不移除Console.WriteLine(nextTask);

3.4 队列计数

使用Count属性获取队列中的元素数量:

Console.WriteLine($"队列中还有{tasks.Count}个任务");

4. 完整示例

usingSystem;usingSystem.Collections.Generic;classQueueExample{staticvoidMain(){// 创建队列Queue<string>messageQueue=newQueue<string>();// 添加消息messageQueue.Enqueue("第一条消息");messageQueue.Enqueue("第二条消息");messageQueue.Enqueue("第三条消息");Console.WriteLine($"队列初始大小:{messageQueue.Count}");// 处理消息while(messageQueue.Count>0){stringmessage=messageQueue.Dequeue();Console.WriteLine($"处理中:{message}");}Console.WriteLine($"处理后队列大小:{messageQueue.Count}");// 尝试查看空队列的Peektry{stringemptyPeek=messageQueue.Peek();}catch(InvalidOperationExceptionex){Console.WriteLine($"错误:{ex.Message}");}}}

5. 高级用法

5.1 遍历队列

虽然队列设计为FIFO结构,但可以使用foreach循环遍历:

Queue<int>numbers=newQueue<int>();numbers.Enqueue(1);numbers.Enqueue(2);numbers.Enqueue(3);foreach(intnuminnumbers){Console.WriteLine(num);}// 注意:遍历不会移除元素

5.2 转换为数组或列表

// 转换为数组int[]numberArray=numbers.ToArray();// 转换为列表List<int>numberList=newList<int>(numbers);

5.3 线程安全队列

在多线程环境中,可以使用ConcurrentQueue<T>

usingSystem.Collections.Concurrent;ConcurrentQueue<int>concurrentQueue=newConcurrentQueue<int>();concurrentQueue.Enqueue(10);concurrentQueue.Enqueue(20);if(concurrentQueue.TryDequeue(outintresult)){Console.WriteLine(result);}

6. 实际应用场景

6.1 任务调度系统

Queue<Action>taskQueue=newQueue<Action>();// 添加任务taskQueue.Enqueue(()=>Console.WriteLine("任务A执行"));taskQueue.Enqueue(()=>Console.WriteLine("任务B执行"));// 执行任务while(taskQueue.Count>0){vartask=taskQueue.Dequeue();task.Invoke();}

6.2 广度优先搜索(BFS)算法

usingSystem;usingSystem.Collections.Generic;classNode{publicintValue{get;set;}publicList<Node>Children{get;set;}=newList<Node>();}classProgram{staticvoidBFS(Noderoot){if(root==null)return;Queue<Node>queue=newQueue<Node>();queue.Enqueue(root);while(queue.Count>0){Nodecurrent=queue.Dequeue();Console.Write(current.Value+" ");foreach(varchildincurrent.Children){queue.Enqueue(child);}}}staticvoidMain(){// 构建树结构Noderoot=newNode{Value=1};root.Children.Add(newNode{Value=2});root.Children.Add(newNode{Value=3});root.Children[0].Children.Add(newNode{Value=4});root.Children[0].Children.Add(newNode{Value=5});Console.WriteLine("广度优先遍历结果:");Bfs(root);// 输出: 1 2 3 4 5}}

7. 性能考虑

  • Queue<T>EnqueueDequeue操作都是O(1)时间复杂度
  • 当队列容量不足时,会自动扩容,这可能导致性能短暂下降
  • 如果需要固定大小的队列,可以考虑使用CircularBuffer等自定义实现

8. 与栈(Stack)的比较

特性队列(Queue)栈(Stack)
顺序先进先出(FIFO)后进先出(LIFO)
添加方法EnqueuePush
移除方法DequeuePop
查看方法PeekPeek
典型应用任务调度、BFS函数调用、撤销操作

总结

C#中的队列(Queue<T>)是一种简单但强大的数据结构,适用于需要先进先出处理的场景。通过本教程,你应该已经掌握了:

  • 队列的基本概念和操作
  • 如何创建和使用队列
  • 队列的高级用法和实际应用
  • 队列与栈的区别
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 10:50:06

Yolov5在HeyGem中用于人脸检测的技术可能性探讨

Yolov5在HeyGem中用于人脸检测的技术可能性探讨 在数字人视频生成系统日益普及的今天&#xff0c;如何让虚拟人物的口型与语音完美同步&#xff0c;成为决定用户体验的关键。而这一切的前提&#xff0c;是系统能否稳定、准确地“看到”原始视频中的人脸——这正是人脸检测技术的…

作者头像 李华
网站建设 2026/5/21 11:42:29

【C#不安全类型转换实战指南】:揭秘高效内存操作的5大核心技巧

第一章&#xff1a;C#不安全类型转换概述在C#编程中&#xff0c;类型系统是保障内存安全和代码稳定的核心机制。然而&#xff0c;在某些特定场景下&#xff0c;开发者可能需要绕过CLR的类型检查&#xff0c;执行不安全的类型转换。这类操作通常涉及指针、未托管内存或跨类型的直…

作者头像 李华
网站建设 2026/5/20 20:10:23

以下从技术架构剖析的真实案例切入,再给出分阶段的学习路线规划,兼顾理论与落地,帮助你高效掌握架构设计能力

以下从技术架构剖析的真实案例切入&#xff0c;再给出分阶段的学习路线规划&#xff0c;兼顾理论与落地&#xff0c;帮助你高效掌握架构设计能力。一、技术架构剖析&#xff1a;2个真实案例 案例1&#xff1a;某电商平台大促订单系统&#xff08;高并发场景&#xff09; 背景&a…

作者头像 李华
网站建设 2026/5/21 11:08:23

【C#集合表达式终极指南】:5分钟掌握数组高效操作核心技术

第一章&#xff1a;C#集合表达式与数组概述 C# 作为一门强类型、面向对象的编程语言&#xff0c;提供了丰富的数据结构支持&#xff0c;其中数组和集合表达式是处理数据序列的核心工具。从 C# 1.0 开始&#xff0c;数组一直是存储固定大小同类型元素的基础方式&#xff1b;而随…

作者头像 李华
网站建设 2026/5/20 13:05:11

Span与unsafe代码共存时的内存防护策略,资深架构师绝不外传的4条铁律

第一章&#xff1a;Span与unsafe代码共存时的内存防护策略&#xff0c;资深架构师绝不外传的4条铁律 在高性能 .NET 应用开发中&#xff0c;Span 与 unsafe 代码常被结合使用以实现零拷贝、高吞吐的数据处理。然而&#xff0c;这种组合也带来了显著的内存安全风险。以下是资深架…

作者头像 李华