public void RemoveItem(PriorityItem <T> item) { PriorityChain <T> chain = item.Chain; this.RemoveItemFromPriorityChain(item); this.RemoveItemFromSequentialChain(item); }
public void ChangeItemPriority(PriorityItem <T> item, double priority) { this.RemoveItemFromPriorityChain(item); PriorityChain <T> chain = this.GetChain(priority); this.InsertItemInPriorityChain(item, chain); }
// Methods public PriorityQueue() { this._priorityChains = new SortedList <int, PriorityChain <T> >(); this._cacheReusableChains = new Stack <PriorityChain <T> >(10); this._head = (PriorityItem <T>)(this._tail = null); this._count = 0; }
internal void InsertItemInSequentialChain(PriorityItem <T> item, PriorityItem <T> after) { if (after == null) { if (this._head != null) { this._head.SequentialPrev = item; item.SequentialNext = this._head; this._head = item; } else { this._head = this._tail = item; } } else { item.SequentialPrev = after; if (after.SequentialNext != null) { item.SequentialNext = after.SequentialNext; after.SequentialNext.SequentialPrev = item; after.SequentialNext = item; } else { after.SequentialNext = item; this._tail = item; } } this._count++; }
internal void InsertItemInPriorityChain(PriorityItem <T> item, PriorityChain <T> chain, PriorityItem <T> after) { item.Chain = chain; if (after == null) { if (chain.Head != null) { chain.Head.PriorityPrev = item; item.PriorityNext = chain.Head; chain.Head = item; } else { chain.Head = chain.Tail = item; } } else { item.PriorityPrev = after; if (after.PriorityNext != null) { item.PriorityNext = after.PriorityNext; after.PriorityNext.PriorityPrev = item; after.PriorityNext = item; } else { after.PriorityNext = item; chain.Tail = item; } } chain.Count++; }
public PriorityItem <T> Enqueue(double priority, T data) { PriorityChain <T> chain = this.GetChain(priority); PriorityItem <T> item = new PriorityItem <T>(data); this.InsertItemInSequentialChain(item, this._tail); this.InsertItemInPriorityChain(item, chain, chain.Tail); return(item); }
public T Dequeue() { int count = this._priorityChains.Count; if (count <= 0) { throw new InvalidOperationException(); } PriorityChain <T> chain = this._priorityChains.Values[count - 1]; PriorityItem <T> head = chain.Head; this.RemoveItem(head); return(head.Data); }
private void InsertItemInPriorityChain(PriorityItem <T> item, PriorityChain <T> chain) { if (chain.Head == null) { this.InsertItemInPriorityChain(item, chain, null); } else { PriorityItem <T> after = null; after = item.SequentialPrev; while (after != null) { if (after.Chain == chain) { break; } after = after.SequentialPrev; } this.InsertItemInPriorityChain(item, chain, after); } }
private void RemoveItemFromSequentialChain(PriorityItem <T> item) { if (item.SequentialPrev != null) { item.SequentialPrev.SequentialNext = item.SequentialNext; } else { this._head = item.SequentialNext; } if (item.SequentialNext != null) { item.SequentialNext.SequentialPrev = item.SequentialPrev; } else { this._tail = item.SequentialPrev; } item.SequentialPrev = (PriorityItem <T>)(item.SequentialNext = null); this._count--; }
private void RemoveItemFromPriorityChain(PriorityItem <T> item) { if (item.PriorityPrev != null) { item.PriorityPrev.PriorityNext = item.PriorityNext; } else { item.Chain.Head = item.PriorityNext; } if (item.PriorityNext != null) { item.PriorityNext.PriorityPrev = item.PriorityPrev; } else { item.Chain.Tail = item.PriorityPrev; } item.PriorityPrev = (PriorityItem <T>)(item.PriorityNext = null); PriorityChain <T> chain = item.Chain; chain.Count--; if (item.Chain.Count == 0) { if (item.Chain.Priority == this._priorityChains.Keys[this._priorityChains.Count - 1]) { this._priorityChains.RemoveAt(this._priorityChains.Count - 1); } else { this._priorityChains.Remove((int)item.Chain.Priority); } if (this._cacheReusableChains.Count < 10) { item.Chain.Priority = -1;//DispatcherPriority.Invalid; this._cacheReusableChains.Push(item.Chain); } } item.Chain = null; }