一、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/zh-tw/n/308509.html