pub struct PriorityQueue<K, V> {
keys: Vec<K>,
vals: Vec<V>,
size: usize
}
impl<K, V> PriorityQueue<K, V> where K: PartialOrd + Copy {
pub fn new() -> PriorityQueue<K, V> {
let keys = Vec::with_capacity(11);
let vals = Vec::with_capacity(11);
let size = 0;
PriorityQueue { keys: keys, vals: vals, size: size }
}
pub fn len(&self) -> usize {
self.keys.len()
}
pub fn enqueue(&mut self, key: K, val: V) {
self.keys.push(key);
self.vals.push(val);
self.size += 1;
let mut i = self.size - 1;
let k = key;
loop {
if i == 0 {
break;
} else {
let n = (i - 1) >> 1;
if k >= self.keys[n] {
break;
} else {
self.keys.swap(i, n);
self.vals.swap(i, n);
i = n;
}
}
}
}
pub fn dequeue(&mut self) -> (K, V) {
assert!(self.size > 0, "The priority queue cannot be empty when dequeueing");
let k0 = self.keys.swap_remove(0);
let v0 = self.vals.swap_remove(0);
self.size -= 1;
if self.size > 0 {
let mut i = 0;
let k = self.keys[0];
loop {
if i >= self.size >> 1 {
break;
} else {
let n = (i << 1) + 1;
let n2 = n + 1;
let n =
if n2 < self.size && self.keys[n] > self.keys[n2] {
n2
} else {
n
};
if k <= self.keys[n] {
break;
} else {
self.keys.swap(i, n);
self.vals.swap(i, n);
i = n;
}
}
}
}
(k0, v0)
}
pub fn minimal_key(&self) -> Option<&K> {
self.keys.get(0)
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
}