75 lines
2.1 KiB
JavaScript
75 lines
2.1 KiB
JavaScript
// https://www.freecodecamp.org/learn/coding-interview-prep/data-structures/create-a-priority-queue-class
|
|
|
|
function PriorityQueue() {
|
|
this.collection = [];
|
|
this.printCollection = function () {
|
|
console.log(
|
|
this.collection.map(([elem, priority, order]) => [elem, priority])
|
|
);
|
|
};
|
|
// Only change code below this line
|
|
this.order = 0;
|
|
this.size = function () {
|
|
return this.collection.length;
|
|
};
|
|
this.isEmpty = function () {
|
|
return !this.collection.length;
|
|
};
|
|
this.swap = function (a, b) {
|
|
const tmp = this.collection[a];
|
|
this.collection[a] = this.collection[b];
|
|
this.collection[b] = tmp;
|
|
};
|
|
this.changePriority = function (a, b) {
|
|
return (
|
|
this.collection[a][1] > this.collection[b][1] ||
|
|
(this.collection[a][1] == this.collection[b][1] &&
|
|
this.collection[a][2] > this.collection[b][2])
|
|
);
|
|
};
|
|
this.enqueue = function (elem) {
|
|
elem.push(this.order++);
|
|
this.collection.push(elem);
|
|
let me = this.collection.length - 1;
|
|
let parent = Math.trunc((me - 1) / 2);
|
|
while (this.changePriority(parent, me)) {
|
|
this.swap(parent, me);
|
|
me = parent;
|
|
parent = Math.trunc((me - 1) / 2);
|
|
}
|
|
};
|
|
this.dequeue = function () {
|
|
if (this.isEmpty()) return;
|
|
this.swap(0, this.collection.length - 1);
|
|
const elem = this.collection.pop()[0];
|
|
let me = 0;
|
|
let leftChild = me * 2 + 1;
|
|
let rightChild = leftChild + 1;
|
|
while (
|
|
(leftChild < this.collection.length &&
|
|
this.changePriority(me, leftChild)) ||
|
|
(rightChild < this.collection.length &&
|
|
this.changePriority(me, rightChild))
|
|
) {
|
|
if (
|
|
rightChild < this.collection.length &&
|
|
this.changePriority(leftChild, rightChild)
|
|
) {
|
|
this.swap(me, rightChild);
|
|
me = rightChild;
|
|
} else {
|
|
this.swap(me, leftChild);
|
|
me = leftChild;
|
|
}
|
|
leftChild = me * 2 + 1;
|
|
rightChild = leftChild + 1;
|
|
}
|
|
return elem;
|
|
};
|
|
this.front = function () {
|
|
if (this.isEmpty()) return;
|
|
return this.collection[0][0];
|
|
};
|
|
// Only change code above this line
|
|
}
|