Краткое описание: в этом уроке вы узнаете о структуре данных очереди и о том, как реализовать очередь в JavaScript.
Введение в структуру данных очереди
Очередь — это упорядоченный список элементов, в котором элемент вставляется в конец очереди и удаляется из передней части очереди.
Очередь работает по принципу «первым пришел — первым ушел» (FIFO), что отличается от стека, который работает по принципу «последним пришел — первым ушел» (LIFO).
Очередь состоит из двух основных операций:
- Вставить новый элемент в конец очереди, что называется enqueue.
- Удалить элемент из передней части очереди, что называется dequeue.
На следующем рисунке показана очередь:
Другой важной операцией очереди является получение элемента, находящегося впереди, называемое peek. В отличие от операции dequeue, операция peek возвращает элемент, находящийся впереди, не изменяя очередь.
Название очереди происходит от аналогии с очередью клиентов в банке. Клиент, который пришел первым, будет обслужен первым, а тот, кто пришел позже, находится в конце очереди и будет обслужен позже.
Реализация очереди в JavaScript с использованием объекта
Ниже показано, как реализовать структуру данных очереди с помощью объекта:
Code language: JavaScript (javascript)class Queue { constructor() { this.elements = {}; this.head = 0; this.tail = 0; } enqueue(element) { this.elements[this.tail] = element; this.tail++; } dequeue() { const item = this.elements[this.head]; delete this.elements[this.head]; this.head++; return item; } peek() { return this.elements[this.head]; } get length() { return this.tail - this.head; } get isEmpty() { return this.length === 0; } }
Как это работает.
Во-первых, инициализируйте объект, хранящий элементы очереди (elements
) и две переменные для отслеживания головы и хвоста в конструкторе:
Code language: JavaScript (javascript)class Queue { constructor() { this.elements = {}; this.head = 0; this.tail = 0; } //... }
Во-вторых, занести элемент в очередь, добавив его в объект elements в конец очереди:
Code language: JavaScript (javascript)class Queue { //... enqueue(element) { this.elements[this.tail] = element; this.tail++; } //... }
В-третьих, удалить элемент из передней части очереди:
Code language: JavaScript (javascript)class Queue { // ... dequeue() { const item = this.elements[this.head]; delete this.elements[this.head]; this.head++; return item; } //... }
В-четвертых, определить метод peek(), который обращается к элементу, находящемуся в начале очереди:
Code language: JavaScript (javascript)class Queue { //... peek() { return this.elements[this.head]; } //... }
В-пятых, получить длину очереди:
Code language: JavaScript (javascript)class Queue { //... get length() { return this.tail - this.head; } //... }
Очередь пуста, если ее длина равна нулю.
Наконец, определите метод isEmpty(), который возвращает true, если очередь пуста:
Code language: JavaScript (javascript)class Queue { // ... get isEmpty() { return this.tail - this.head; } // ... }
Чтобы создать новую очередь из функции конструктора Queue()
, вы используете ключевое слово new следующим образом:
Code language: JavaScript (javascript)let q = new Queue();
Чтобы поставить в очередь числа от 1 до 7, вы используете следующий код.
Code language: JavaScript (javascript)for (let i = 1; i <= 7; i++) { q.enqueue(i); }
Для получения номера, находящегося в начале очереди, используется метод peek()
.
Code language: JavaScript (javascript)console.log(q.peek()); // 1
Для получения текущей длины очереди используется метод length()
, как в следующем примере.
Code language: JavaScript (javascript)console.log(q.length); // 7
Для удаления элемента, находящегося в начале очереди, используется метод dequeue()
, как показано в следующем примере:
Code language: JavaScript (javascript)// dequeue all elements while (!q.isEmpty()) { console.log(q.dequeue()); }
Соберите все вместе:
Code language: JavaScript (javascript)class Queue { constructor() { this.elements = {}; this.head = 0; this.tail = 0; } enqueue(element) { this.elements[this.tail] = element; this.tail++; } dequeue() { const item = this.elements[this.head]; delete this.elements[this.head]; this.head++; return item; } peek() { return this.elements[this.head]; } get length() { return this.tail - this.head; } get isEmpty() { return this.length === 0; } } let q = new Queue(); for (let i = 1; i <= 7; i++) { q.enqueue(i); } // get the current item at the front of the queue console.log(q.peek()); // 1 // get the current length of queue console.log(q.length); // 7 // dequeue all elements while (!q.isEmpty) { console.log(q.dequeue()); }
Резюме
- Очередь — это структура данных, работающая по принципу FIFO.