C# - 队列<T>

本文关键字:gt lt 队列 | 更新日期: 2023-09-12 17:39:38

Queue是一种特殊类型的集合,它以FIFO样式(先进先出)存储元素,与Stack<T>集合完全相反。它包含元素的添加顺序。 C# 包括泛型Queue<T>和非泛型Queue集合。建议使用泛型Queue<T>集合。

队列<T>特征

  • Queue<T>是FIFO(先进先出)集合。
  • 它属于System.Collection.Generic命名空间。
  • Queue<T>可以包含指定类型的元素。它提供编译时类型检查,并且不执行装箱拆箱,因为它是泛型的。
  • 可以使用Enqueue()方法添加元素。不能使用集合初始值设定项语法。
  • 可以使用Dequeue()Peek()方法检索元素。它不支持索引器。

下图说明了队列集合:

创建队列

可以通过为Queue<T>对象可以存储的元素类型指定类型参数来创建该对象。 下面的示例使用 Enqueue() 方法在Queue<T>中创建和添加元素。 Queue集合允许 null(对于引用类型)和重复值。

Example: Create and Add Elements in the Queue

Queue<int> callerIds = new Queue<int>();
callerIds.Enqueue(1);
callerIds.Enqueue(2);
callerIds.Enqueue(3);
callerIds.Enqueue(4);
foreach(var id in callerIds)
    Console.Write(id); //prints 1234

队列<T>属性和方法

用法
属性
计数返回队列中元素的总数。
用法
Method
排队(T)将项目添加到队列中。
出列从队列的开头返回一个项目,并将其从队列中删除。
躲猫()返回队列中的第一项而不将其删除。
包含(T)检查项目是否在队列中
清除()从队列中删除所有项目。

从队列中检索元素

Dequeue()Peek() 方法用于检索队列集合中的第一个元素。 Dequeue()从队列中删除并返回第一个元素,因为队列按 FIFO 顺序存储元素。 在空队列上调用 Dequeue() 方法将引发InvalidOperation异常。 因此,在调用队列之前,请始终检查队列的总数是否大于零。

Example: Reading Queue

Queue<string> strQ = new Queue<string>();
strQ.Enqueue("H");
strQ.Enqueue("e");
strQ.Enqueue("l");
strQ.Enqueue("l");
strQ.Enqueue("o");
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 5
while (strQ.Count > 0)
    Console.WriteLine(strQ.Dequeue()); //prints Hello
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 0

Peek() 方法始终返回队列集合中的第一个项,而不将其从队列中删除。 在空队列上调用 Peek() 方法将引发运行时异常InvalidOperationException

Example: Peek()

Queue<string> strQ = new Queue<string>();
strQ.Enqueue("H");
strQ.Enqueue("e");
strQ.Enqueue("l");
strQ.Enqueue("l");
strQ.Enqueue("o");
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 5
if(strQ.Count > 0){
    Console.WriteLine(strQ.Peek()); //prints H
    Console.WriteLine(strQ.Peek()); //prints H
}
Console.WriteLine("Total elements: {0}", strQ.Count); //prints 5

Contains()

Contains() 方法检查队列中是否存在项。 如果指定的项存在,则返回 true,否则返回 false。

包含() 签名:bool Contains(object obj);

Example: Contains()

Queue<int> callerIds = new Queue<int>();
callerIds.Enqueue(1);
callerIds.Enqueue(2);
callerIds.Enqueue(3);
callerIds.Enqueue(4);
callerIds.Contains(2); //true
callerIds.Contains(10); //false