Files

232 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 587d8255367417b2b2512c74
title: Створення черги з пріоритетами
challengeType: 1
forumTopicId: 301630
dashedName: create-a-priority-queue-class
---
# --description--
В цьому завданні ви навчитеся створювати чергу з пріоритетами. Черга з пріоритетами - це особливий тип черги, в якій елементи можуть мати додаткову інформацію про їх пріоритет. Його можна просто представити цілим числом. Пріоритет елементів замінить порядок їх розміщення в черзі та визначить, в якій послідовності елементи вилучатимуться з неї. Якщо елемент з вищим пріоритетом розташований після елементу з нижчим пріоритетом, то першим все одно вилучиться елемент з вищим пріоритетом.
До прикладу, уявімо, що в нашій черзі з пріоритетом є три елементи:
```js
[['kitten', 2], ['dog', 2], ['rabbit', 2]]
```
Тут друге значення (яке є цілим числом) вказує на пріоритет елемента. Якщо ми додамо в чергу елемент `['human', 1]` з пріоритетом `1` (за умови, що елементи з нижчим пріоритетом знаходяться перед ним), то саме цей елемент буде виключено з черги першим. Набір елементів має виглядати так:
```js
[['human', 1], ['kitten', 2], ['dog', 2], ['rabbit', 2]]
```
Ми почали писати чергу з пріоритетом `PriorityQueue` в редакторі коду. Вам потрібно буде додати метод `enqueue` для додавання елементів з пріоритетами, метод `dequeue` - для видалення та повернення елементів, метод `size` - для повернення кількості елементів в черзі, метод `front` - для повернення елементу на початок черги й нарешті метод `isEmpty`, який повертає `true`, якщо черга порожня, або `false`, якщо ні.
Метод `enqueue` має приймати елементи у форматі, який показано вище (`['human', 1]`) де `1` - це пріоритет. Метод `dequeue` та `front` повинні повернути тільки ім'я елементу, а не його пріоритет.
# --hints--
Ваша черга з пріоритетом `PriorityQueue` повинна мати метод `enqueue`.
```js
assert(
(function () {
var test = new PriorityQueue();
return typeof test.enqueue === 'function';
})()
);
```
Ваш `PriorityQueue` повинна мати `dequeue` метод.
```js
assert(
(function () {
var test = new PriorityQueue();
return typeof test.dequeue === 'function';
})()
);
```
Ваша черга з пріоритетом `PriorityQueue` повинна мати метод `size`.
```js
assert(
(function () {
var test = new PriorityQueue();
return typeof test.size === 'function';
})()
);
```
Ваша черга з пріоритетом `PriorityQueue` повинна мати метод `front`.
```js
assert(
(function () {
var test = new PriorityQueue();
return typeof test.front === 'function';
})()
);
```
Ваша черга з пріоритетом `PriorityQueue` повинна мати метод `isEmpty`.
```js
assert(
(function () {
var test = new PriorityQueue();
return typeof test.isEmpty === 'function';
})()
);
```
Ваша черга з пріоритетом `PriorityQueue` повинна правильно відстежувати поточну кількість елементів, використовуючи метод `size`, оскільки елементи додаються до та вилучаються з черги.
```js
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;
})()
);
```
Метод `front` повинен правильно повертати елементи на початок черги, позаяк елементи додаються та вилучаються з черги.
```js
assert(
(function () {
var test = new PriorityQueue();
test.enqueue(['David Brown', 2]);
var front1 = test.front();
test.enqueue(['Jon Snow', 1]);
var front2 = test.front();
test.dequeue();
test.enqueue(['A', 3]);
var front3 = test.front();
test.enqueue(['B', 3]);
test.enqueue(['C', 3]);
test.dequeue();
var front4 = test.front();
return (
front1 === 'David Brown' &&
front2 === 'Jon Snow' &&
front3 === 'David Brown' &&
front4 === 'A'
);
})()
);
```
Метод `isEmpty` повинен повернути `true`, коли черга порожня.
```js
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();
})()
);
```
Черга з пріоритетом повинна повертати елементи з вищим пріоритетом перед елементами з нижчим пріоритетом, а в іншому випадку - повертати елементи в порядку "перший прийшов - перший пішов".
```js
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';
})()
);
```
# --seed--
## --seed-contents--
```js
function PriorityQueue () {
this.collection = [];
this.printCollection = function() {
console.log(this.collection);
};
// Only change code below this line
// Only change code above this line
}
```
# --solutions--
```js
function PriorityQueue() {
this.collection = [];
this.printCollection = function () {
console.log(this.collection);
};
// Only change code below this line
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.";
}
};
this.size = function () {
return this.collection.length;
};
this.front = function () {
return this.collection[0][0];
};
this.isEmpty = function () {
return this.size() > 0 ? false : true;
};
// Only change code above this line
}
```