Skip to main content

队列(Queue)

在 C# 中,Queue 是一个先进先出(FIFO, First In First Out)数据结构。

Queue 属于 System.Collections 或 System.Collections.Generic 命名空间,分别提供非泛型和泛型版本的实现。Queue 适用于需要按照入队顺序处理数据的场景。

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

特性

  • 先进先出:最早加入队列的元素最先被移除。
  • 动态大小:队列的容量会根据需要动态调整。
  • 泛型支持:通过 Queue<T> 可以存储强类型的元素。
  • 线程安全Queue 本身不是线程安全的,但可以使用 ConcurrentQueue<T> 实现线程安全。

Queue 类的方法和属性

下表列出了 Queue 类的一些常用的 属性

属性名称类型描述
Countint获取队列中的元素个数。
SyncRootobject获取一个对象,用于同步对队列的访问(非泛型)。
IsSynchronizedbool指示队列的访问是否同步(线程安全,始终为 false)。

下表列出了 Queue 类的一些常用的 方法

方法名称返回类型描述
元素操作
Enqueue(object item)void将元素添加到队列的末尾。
Dequeue()object移除并返回队列开头的元素。
Peek()object返回队列开头的元素,但不移除。
Clear()void移除队列中的所有元素。
检查与复制
Contains(object item)bool确定某元素是否存在于队列中。
ToArray()object[]将队列中的元素复制到新数组中。
Clone()object创建当前队列的浅表副本。
CopyTo(Array array, int index)void将队列中的元素复制到现有数组,从指定索引开始。
枚举器支持
GetEnumerator()IEnumerator返回一个枚举器,用于循环访问队列中的元素。
线程安全
Synchronized(Queue queue)Queue返回一个线程安全的队列包装器。

实例

下面的实例演示了队列(Queue)的使用:

using System;
using System.Collections;

class Program
{
static void Main()
{
Queue queue = new Queue();

// 添加元素
queue.Enqueue("First");
queue.Enqueue("Second");
queue.Enqueue("Third");

// 查看队首
Console.WriteLine($"Peek: {queue.Peek()}"); // 输出:First

// 移除元素
Console.WriteLine($"Dequeue: {queue.Dequeue()}"); // 输出:First

// 剩余元素
foreach (var item in queue)
{
Console.WriteLine(item); // 输出:Second, Third
}

// 检查包含
Console.WriteLine($"Contains 'Second': {queue.Contains("Second")}"); // 输出:True

// 转数组
object[] array = queue.ToArray();
Console.WriteLine($"Array Length: {array.Length}"); // 输出:2
}
}
using System;
using System.Collections;

namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
Queue q = new Queue();

q.Enqueue('A');
q.Enqueue('M');
q.Enqueue('G');
q.Enqueue('W');

Console.WriteLine("Current queue: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
q.Enqueue('V');
q.Enqueue('H');
Console.WriteLine("Current queue: ");
foreach (char c in q)
Console.Write(c + " ");
Console.WriteLine();
Console.WriteLine("Removing some values ");
char ch = (char)q.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
ch = (char)q.Dequeue();
Console.WriteLine("The removed value: {0}", ch);
Console.ReadKey();
}
}
}

当上面的代码被编译和执行时,它会产生下列结果:

Current queue: 
A M G W
Current queue:
A M G W V H
Removing values
The removed value: A
The removed value: M