5.9 KiB
5.9 KiB
id | title | challengeType |
---|---|---|
587d8255367417b2b2512c74 | Create a Priority Queue Class | 1 |
Description
[[’kitten’, 2], [‘dog’, 2], [‘rabbit’, 2]]
Here the second value (an integer) represents item priority. If we enqueue [‘human’, 1]
with a priority of 1
(assuming lower priorities are given precedence) it would then be the first item to be dequeued. The collection would like this:
[[‘human’, 1], [’kitten’, 2], [‘dog’, 2], [‘rabbit’, 2]]
.
We’ve started writing a PriorityQueue
in the code editor. You will need to add an enqueue
method for adding items with a priority, a dequeue
method for removing items, a size
method to return the number of items in the queue, a front
method to return the element at the front of the queue, and finally an isEmpty
method that will return true
if the queue is empty or false
if it is not.
The enqueue
should accept items with the format shown above (['human', 1]
) where 1
represents the priority. The dequeue
should return only the current item, not its priority.
Instructions
Tests
tests:
- text: Your <code>Queue</code> class should have a <code>enqueue</code> method.
testString: assert((function(){var test = new PriorityQueue(); return (typeof test.enqueue === 'function')}()), 'Your <code>Queue</code> class should have a <code>enqueue</code> method.');
- text: Your <code>Queue</code> class should have a <code>dequeue</code> method.
testString: assert((function(){var test = new PriorityQueue(); return (typeof test.dequeue === 'function')}()), 'Your <code>Queue</code> class should have a <code>dequeue</code> method.');
- text: Your <code>Queue</code> class should have a <code>size</code> method.
testString: assert((function(){var test = new PriorityQueue(); return (typeof test.size === 'function')}()), 'Your <code>Queue</code> class should have a <code>size</code> method.');
- text: Your <code>Queue</code> class should have an <code>isEmpty</code> method.
testString: assert((function(){var test = new PriorityQueue(); return (typeof test.isEmpty === 'function')}()), 'Your <code>Queue</code> class should have an <code>isEmpty</code> method.');
- text: Your PriorityQueue should correctly keep track of the current number of items using the <code>size</code> method as items are enqueued and dequeued.
testString: assert((function(){var test = new PriorityQueue(); test.enqueue(['David Brown', 2]); test.enqueue(['Jon Snow', 1]); var size1 = test.size(); test.dequeue(); var size2 = test.size(); test.enqueue(['A', 3]); test.enqueue(['B', 3]); test.enqueue(['C', 3]); return (size1 === 2 && size2 === 1 && test.size() === 4)}()), 'Your PriorityQueue should correctly keep track of the current number of items using the <code>size</code> method as items are enqueued and dequeued.');
- text: The <code>isEmpty</code> method should return <code>true</code> when the queue is empty.
testString: assert((function(){var test = new PriorityQueue(); test.enqueue(['A', 1]); test.enqueue(['B', 1]); test.dequeue(); var first = test.isEmpty(); test.dequeue(); return (!first && test.isEmpty()); }()), 'The <code>isEmpty</code> method should return <code>true</code> when the queue is empty.');
- text: The priority queue should return items with a higher priority before items with a lower priority and return items in first-in-first-out order otherwise.
testString: assert((function(){var test = new PriorityQueue(); test.enqueue(['A', 5]); test.enqueue(['B', 5]); test.enqueue(['C', 5]); test.enqueue(['D', 3]); test.enqueue(['E', 1]); test.enqueue(['F', 7]); var result = []; result.push(test.dequeue()); result.push(test.dequeue()); result.push(test.dequeue()); result.push(test.dequeue()); result.push(test.dequeue()); result.push(test.dequeue()); return result.join('') === 'EDABCF';}()), 'The priority queue should return items with a higher priority before items with a lower priority and return items in first-in-first-out order otherwise.');
Challenge Seed
function PriorityQueue () {
this.collection = [];
this.printCollection = function() {
console.log(this.collection);
};
// Only change code below this line
// Only change code above this line
}
Solution
function PriorityQueue () {
this.collection = [];
this.printCollection = function(){
console.log(this.collection);
};
this.size = function() {
return this.collection.length;
};
this.isEmpty = function() {
return this.size() > 0 ? false : true;
};
this.enqueue = function (newitem) {
if (this.isEmpty()) {
return this.collection.push(newitem);
}
this.collection = this.collection.reverse();
var found_index = this.collection.findIndex(function (item) {
return newitem[1] >= item[1];
});
if (found_index === -1) {
this.collection.push(newitem);
} else {
this.collection.splice(found_index, 0, newitem);
}
this.collection = this.collection.reverse();
};
this.dequeue = function() {
if (!this.isEmpty()) {
return this.collection.shift()[0];
} else {
return 'The queue is empty.'
}
};
}