5.2 KiB
5.2 KiB
Queue
概念:
Queue 是 C# 提供的一个==非泛型队列集合==
队列的特点是:==先进先出==
英文:
FIFO:First In First Out
简单理解: 像排队买东西 先排队的人,先被处理
命名空间:
using System.Collections;
通常用法
- 处理需要“按进入顺序依次处理”的数据
- 保存等待处理的任务
- 模拟排队、消息、请求等逻辑
- 学习队列这种数据结构
实际开发中:
新代码更推荐使用 Queue<T>
这里的 Queue 是非泛型版本
语法
创建:
Queue queue = new Queue();
入队:
queue.Enqueue(数据);
出队:
object value = queue.Dequeue();
查看队头:
object value = queue.Peek();
数量:
queue.Count
基础案例
using System;
using System.Collections;
Queue queue = new Queue();
queue.Enqueue("第一个任务");
queue.Enqueue("第二个任务");
queue.Enqueue("第三个任务");
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
Console.WriteLine(queue.Dequeue());
输出:
第一个任务
第二个任务
第三个任务
理解:
"第一个任务"最先进队列Dequeue()会先取出最早进入队列的元素- 这就是先进先出
Enqueue、Dequeue、Peek
Enqueue:
把元素添加到队尾
queue.Enqueue("A");
Dequeue:
取出并删除队头元素
object item = queue.Dequeue();
Peek:
查看队头元素,但不删除
object item = queue.Peek();
案例:
Queue queue = new Queue();
queue.Enqueue("A");
queue.Enqueue("B");
Console.WriteLine(queue.Peek()); // A
Console.WriteLine(queue.Count); // 2
Console.WriteLine(queue.Dequeue()); // A
Console.WriteLine(queue.Count); // 1
遍历
Queue queue = new Queue();
queue.Enqueue("A");
queue.Enqueue("B");
queue.Enqueue("C");
foreach (object item in queue)
{
Console.WriteLine(item);
}
输出顺序一般是:
A
B
C
理解:
遍历 Queue 时,通常按入队顺序从队头到队尾遍历
常用成员
Queue queue = new Queue();
queue.Enqueue("A");
queue.Enqueue("B");
Console.WriteLine(queue.Count);
Console.WriteLine(queue.Contains("A"));
object first = queue.Peek();
object value = queue.Dequeue();
queue.Clear();
常用方法:
Enqueue(object obj):入队Dequeue():出队并删除Peek():查看队头但不删除Contains(object obj):判断是否包含Clear():清空ToArray():转成数组
空队列不能 Dequeue 或 Peek
错误写法:
Queue queue = new Queue();
queue.Dequeue();
原因: 队列里没有元素,不能取队头
更稳的写法:
if (queue.Count > 0)
{
object value = queue.Dequeue();
}
Peek() 也一样,使用前最好先判断 Count。
取值时要类型转换
Queue queue = new Queue();
queue.Enqueue(100);
int num = (int)queue.Dequeue();
原因:
非泛型 Queue 中的元素按 object 存储
取出来也是 object
值类型入队和出队时,也会涉及装箱拆箱:
queue.Enqueue(100); // 装箱
int num = (int)queue.Dequeue(); // 拆箱
适合场景:任务队列
Queue taskQueue = new Queue();
taskQueue.Enqueue("加载配置");
taskQueue.Enqueue("读取存档");
taskQueue.Enqueue("进入场景");
while (taskQueue.Count > 0)
{
string task = (string)taskQueue.Dequeue();
Console.WriteLine("处理:" + task);
}
理解: 任务按照加入顺序依次处理 这种情况适合用队列
Queue 和 Stack 的区别
| 对比点 | Queue | Stack |
|---|---|---|
| 规则 | 先进先出 | 后进先出 |
| 英文 | FIFO | LIFO |
| 添加 | Enqueue |
Push |
| 取出 | Dequeue |
Pop |
| 查看 | Peek 查看队头 |
Peek 查看栈顶 |
| 适合场景 | 排队处理任务 | 撤销、回退 |
一句话:
排队用 Queue
回退用 Stack
注意
Queue在System.Collections命名空间中Queue是非泛型集合,元素按object存储- 队列的规则是先进先出
Enqueue是入队Dequeue是出队并删除队头Peek是查看队头但不删除- 空队列调用
Dequeue()或Peek()会出错 - 新项目通常优先使用
Queue<T>
一句话记忆
==Queue 是先进先出的集合,先进去的先出来。==
面试/复习时怎么说
可以这样答:
“Queue 是队列结构,特点是先进先出,也就是 FIFO。
常用方法有 Enqueue、Dequeue 和 Peek,分别表示入队、出队、查看队头。
非泛型 Queue 存的是 object,取值时可能需要强制类型转换,新项目中更推荐使用 Queue<T>。”
引用:
- Microsoft Learn: Queue Class
- Microsoft Learn: Queue.Enqueue Method
- Microsoft Learn: System.Collections Namespace
#Queue #队列 #集合 #进阶