6 using System.Collections.Generic;
17 class PriorityQueue<TPriority, TValue> : IEnumerable<KeyValuePair<TPriority, TValue>>
25 this.parentCollection = parentCollection;
32 foreach (KeyValuePair<TPriority, TValue> pair
in parentCollection)
34 yield
return pair.Value;
38 IEnumerator IEnumerable.GetEnumerator()
40 return GetEnumerator();
46 private readonly IComparer<TPriority> priorityComparer;
54 throw new ArgumentNullException();
57 priorityComparer = comparer;
60 private readonly List<KeyValuePair<TPriority, TValue>> queue =
new List<KeyValuePair<TPriority, TValue>>();
61 private ValueCollection valueCollection;
63 public ValueCollection Values
67 if (valueCollection == null)
69 valueCollection =
new ValueCollection(
this);
72 return valueCollection;
80 return queue.GetEnumerator();
83 IEnumerator IEnumerable.GetEnumerator()
85 return GetEnumerator();
103 public void Push(TPriority priority, TValue value)
105 queue.Add(
new KeyValuePair<TPriority, TValue>(priority, value));
123 public KeyValuePair<TPriority, TValue> Top
135 public KeyValuePair<TPriority, TValue>
Pop()
137 KeyValuePair<TPriority, TValue> ret = queue[0];
138 queue[0] = queue[queue.Count - 1];
139 queue.RemoveAt(queue.Count - 1);
149 return queue.Any(itm => EqualityComparer<TValue>.Default.Equals(itm.Value, value));
157 int idx = queue.FindIndex(itm => EqualityComparer<TValue>.Default.Equals(itm.Value, value));
163 queue[idx] = queue[queue.Count - 1];
164 queue.RemoveAt(queue.Count - 1);
176 bool removed =
false;
178 for (
int i = queue.Count - 1; i >= 0; --i)
181 if (queue[i].Key.Equals(priority) && (shouldRemove == null || shouldRemove(queue[i].Value)))
183 queue[i] = queue[queue.Count - 1];
184 queue.RemoveAt(queue.Count - 1);
197 private void BubbleUp()
199 int node = queue.Count - 1;
202 int parent = (node - 1) >> 1;
203 if (priorityComparer.Compare(queue[parent].Key, queue[node].Key) < 0)
207 KeyValuePair<TPriority, TValue> tmp = queue[parent];
208 queue[parent] = queue[node];
217 private void BubbleDown()
223 int child0 = (node << 1) + 1;
224 int child1 = (node << 1) + 2;
226 if (child0 < queue.Count && child1 < queue.Count)
228 smallest = priorityComparer.Compare(queue[child0].Key, queue[child1].Key) < 0 ? child0 : child1;
230 else if (child0 < queue.Count)
234 else if (child1 < queue.Count)
243 if (priorityComparer.Compare(queue[node].Key, queue[smallest].Key) < 0)
248 KeyValuePair<TPriority, TValue> tmp = queue[node];
249 queue[node] = queue[smallest];
250 queue[smallest] = tmp;