有時,在某些情況下,必需打破 FIFO 的原則,需要讓後面進來的特定的資源提早被離開 Queue。
我們再來看個例子。
有 10 個病人到診所,己經掛完號,領了號碼牌,排隊等著叫號看診。
突然,有一名爸爸,背著高燒不退的孩子,衝到診所掛號看病。
這時,有三種處理情境。
第一種情況,就是一般的 Queue 的特性,前面己經討論過了,就不再多說明。
第三種情況,是多個 Queue 與 Router 的組合技,這部份後面會提到,就先略過不提。
先討論第二種情況,當資源加入 Queue 後,離開 Queue 順序會因為權重而有所變更。用白話來說,這就是插隊機制。
這種打破 FIFO 特性,卻又保留部份 FIFO 的 Queu,稱為 Priority Queue 。
而權重的比對,可以組合 Compare
與不同的 排序演算法
的實作,來決定各資源離開的順序。
雖然實作方式有很多種。但在下面的簡易實作,使用一個 Priority
做為參數,以便排序使用。
public class PriorityQueue
{
private class QueueBlock
{
public int Priority { set; get; }
public int Entity { set; get; }
}
private const int MaxSize = 20;
private readonly QueueBlock[] _buffer = new QueueBlock[MaxSize];
private int _index = 0;
public void Enqueue(int priority, int item)
{
var block = new QueueBlock() { Priority = priority, Entity = item };
for (int i = _index; i >= 0; i--)
{
if (i - 1 < 0 || _buffer[i - 1].Priority <= priority)
{
_buffer[i] = block;
break;
}
else
{
_buffer[i] = _buffer[i - 1];
}
}
_index++;
}
public bool IsEmpty {...}
public int Dequeue(){...}
}