C#中的Queue类是System.Collections.Generic命名空间下提供的先进先出集合类型,主要用于按顺序存储和取出元素,而入队操作是向队列末尾添加元素的核心方法。除了标准的单端Queue,C#也提供了支持两端操作的双端队列类型,满足更多场景的需求。

Queue类的入队操作
Queue类的入队操作通过Enqueue方法实现,该方法接收一个泛型参数,即要添加到队列中的元素,添加后元素会位于队列的尾部,后续通过Dequeue方法取出时,会先取出最早入队的元素。
基础入队示例
以下代码展示了Queue的基础入队和出队操作:
using System;
using System.Collections.Generic;
namespace QueueDemo
{
class Program
{
static void Main(string[] args)
{
// 创建整数类型的Queue实例
Queue<int> numberQueue = new Queue<int>();
// 执行入队操作
numberQueue.Enqueue(10);
numberQueue.Enqueue(20);
numberQueue.Enqueue(30);
Console.WriteLine("当前队列元素数量:" + numberQueue.Count);
// 执行出队操作
int firstElement = numberQueue.Dequeue();
Console.WriteLine("出队的元素:" + firstElement);
Console.WriteLine("出队后队列元素数量:" + numberQueue.Count);
}
}
}
入队操作的特性
- 入队操作的时间复杂度为O(1),除非队列的容量需要扩容,此时会触发数组复制,时间复杂度变为O(n)。
- Queue类的容量默认初始值为10,当元素数量超过容量时,会自动扩容为原来的两倍。
- 入队操作不会修改已有元素的位置,只会在队列尾部追加新元素。
C#中的双端队列实现
C#中没有直接命名为Deque的内置类,但是System.Collections.Generic命名空间下的LinkedList<T>类可以实现双端队列的所有功能,同时.NET 6及以上版本还提供了System.Collections.Deque<T>类型,不过更常用的还是通过LinkedList实现双端队列。
LinkedList实现双端队列
LinkedList支持在头部和尾部同时添加和移除元素,完全符合双端队列的特性,对应的操作方法如下:
| 操作 | 方法 | 说明 |
|---|---|---|
| 队尾入队 | AddLast | 向双端队列的尾部添加元素 |
| 队头入队 | AddFirst | 向双端队列的头部添加元素 |
| 队尾出队 | RemoveLast | 移除双端队列尾部的元素并返回 |
| 队头出队 | RemoveFirst | 移除双端队列头部的元素并返回 |
双端队列使用示例
以下代码展示了用LinkedList实现双端队列的操作:
using System;
using System.Collections.Generic;
namespace DequeDemo
{
class Program
{
static void Main(string[] args)
{
// 创建LinkedList作为双端队列
LinkedList<string> deque = new LinkedList<string>();
// 队尾入队
deque.AddLast("元素1");
deque.AddLast("元素2");
// 队头入队
deque.AddFirst("元素0");
Console.WriteLine("双端队列当前元素:");
foreach (var item in deque)
{
Console.WriteLine(item);
}
// 队头出队
deque.RemoveFirst();
Console.WriteLine("队头出队后元素:");
foreach (var item in deque)
{
Console.WriteLine(item);
}
// 队尾出队
deque.RemoveLast();
Console.WriteLine("队尾出队后元素:");
foreach (var item in deque)
{
Console.WriteLine(item);
}
}
}
}
Queue与双端队列的选择
如果只需要先进先出的场景,比如任务排队、消息缓冲,优先选择Queue类,它的实现更简单,开销更小。如果需要在队列两端都进行添加和移除操作,比如滑动窗口、撤销重做功能,就选择双端队列实现。
注意:Queue的Enqueue方法不允许添加null元素,而LinkedList作为双端队列使用时可以添加null值,使用时需要根据需求做校验。