一、Queue简介
Queue是C#中的一种数据结构,是一种线性的数据结构,遵循先进先出的原则。它类似于现实生活中排队等待的场景,队尾插入元素,队头删除元素。
Queue是一个强类型的泛型类,其中T指示队列中存储的元素类型。Queue的基础类库中的实现是用数组构建的,但是从表面上看,它看起来像链表,队列的头和尾都可以进行插入和删除。
二、Queue成员
1. Count属性
Count属性可以返回队列中的元素数量
“`
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
Console.WriteLine(queue.Count); //3
“`
2. Enqueue方法
Enqueue方法用于将元素插入到队列的末尾
“`
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
“`
3. Dequeue方法
Dequeue方法用于从队列的头部删除一个元素,并返回该元素。
“`
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
int first = queue.Dequeue();
Console.WriteLine(first); //1
Console.WriteLine(queue.Count); //2
“`
4. Peek方法
Peek方法返回队列头部的元素,但不删除它。
“`
Queue queue = new Queue();
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);
int first = queue.Peek();
Console.WriteLine(first); //1
Console.WriteLine(queue.Count); //3
“`
三、Queue的用途
Queue常用于异步处理中,通过队列方式缓存任务,防止系统崩溃,例如定时任务、IO操作。
以下是一个简单的定时任务例子,每隔5秒执行一次指定操作:
“`
static void Main(string[] args)
{
Queue queue = new Queue();
queue.Enqueue(() => Console.WriteLine(“执行操作1”));
queue.Enqueue(() => Console.WriteLine(“执行操作2”));
queue.Enqueue(() => Console.WriteLine(“执行操作3”));
while (true)
{
if (queue.Count > 0)
{
Action action = queue.Dequeue();
action.Invoke();
}
Thread.Sleep(5000);
}
}
“`
四、Queue实现原理
Queue的基本实现是通过一个数组和两个指针来完成的:一个指向队列的头部,另一个指向队列的尾部。队列的插入和删除操作只能从队列的尾部和头部进行。
以下是一个简单的Queue的基本实现代码:
“`
public class Queue
{
private T[] _items;
private int _head;
private int _tail;
private int _size;
public int Count => _size;
public Queue() => _items = new T[0];
public Queue(int capacity)
{
if (capacity 0)
{
if (_head < _tail)
{
Array.Copy(_items, _head, newArray, 0, _size);
}
else
{
Array.Copy(_items, _head, newArray, 0, _items.Length – _head);
Array.Copy(_items, 0, newArray, _items.Length – _head, _tail);
}
}
_items = newArray;
_head = 0;
_tail = (_size == newLength) ? 0 : _size;
}
_items[_tail] = item;
_tail = (_tail + 1) % _items.Length;
_size++;
}
public T Dequeue()
{
if (_size == 0)
throw new InvalidOperationException("队列为空。");
T dequeued = _items[_head];
_items[_head] = default;
_head = (_head + 1) % _items.Length;
_size–;
return dequeued;
}
public T Peek()
{
if (_size == 0)
throw new InvalidOperationException("队列为空。");
return _items[_head];
}
}
“`
上述代码中,_items数组用于存储队列中的元素,_head指针指向队列的头部,_tail指针指向队列的尾部,_size用于记录队列中的元素个数。
五、总结
Queue是C#中非常重要的一种数据结构,它是用数组构建的,但是它看起来像链表,队列的头和尾都可以进行插入和删除。使用Queue可以提高代码的效率,常用于异步处理中,例如定时任务、IO操作。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/308509.html