Структура данных и реализация очереди в JavaScript

В этом руководстве вы узнаете о структуре данных Queue и о том, как реализовать очередь в JavaScript.

Очередь — это упорядоченный список элементов, где элемент вставляется в конец очереди и удаляется из начала очереди.

Queue работает по принципу «первым поступил — первым обслужен» (FIFO), который отличается от стека, работающего по принципу «последним пришел — первым обслужен» (LIFO).

Очередь имеет две основные операции:

  • Вставка нового элемента в конец очереди, которая называется enqueue.
  • Удаление элемента из начала очереди, которое называется dequeue.

На следующем рисунке показана очередь:

Иллюстрация очереди JavaScript

Другой важной операцией очереди является получение элемента в начале, называемое peek. В отличие от операции удаления из очереди, операция просмотра возвращает элемент в начале без изменения очереди.

Название queue происходит от аналогии с очередью клиентов в банке. Клиент, который придет первым, будет обслужен первым, а тот, кто придет позже, будет поставлен в очередь в конце очереди и будет обслужен позже.

Очередь в банк
Пример очереди

Реализация очереди JavaScript с использованием объекта

Ниже показано, как реализовать структуру данных queue с помощью объекта:

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 ) и две переменные для отслеживания головы и хвоста:
class Queue {
  constructor() {
    this.elements = {};
    this.head = 0;
    this.tail = 0;
  }
  //...
}
  • Во-вторых, поставьте элемент в очередь, добавив его в объект elements в конец очереди:
class Queue {
  //...
  enqueue(element) {
    this.elements[this.tail] = element;
    this.tail++;
  }

  //...
}
  • В-третьих, удалите элемент из начала очереди:
class Queue {

  // ...
  dequeue() {
    const item = this.elements[this.head];
    delete this.elements[this.head];
    this.head++;
    return item;
  }

  //...
}
  • В-четвертых, определите метод peek(), который обращается к элементу в начале очереди:
class Queue {
  //...
  peek() {
    return this.elements[this.head];
  }
  //...  
}
  • В-пятых, получите длину очереди:
class Queue {
  //...
  get length() {
    return this.tail - this.head;
  }
  //...
}

Очередь пуста, когда длина равна нулю.

  • Наконец, определите метод isEmpty(), который возвращает true, если очередь пуста:
class Queue {
  // ...
  get isEmpty() {
    return this.tail - this.head;
  }
  // ... 
}

Чтобы создать новую очередь из функции-конструктора Queue(), используйте ключевое слово new следующим образом:

let q = new Queue();

Чтобы поставить в очередь числа от 1 до 7, используйте следующий код.

for(let i = 1; i <= 7; i++) {
    q.enqueue(i);
}

Чтобы получить номер в начале очереди, используйте метод peek().

console.log(q.peek());
 // 1

Чтобы получить текущую длину очереди, используйте метод length(), как в следующем примере.

console.log(q.length);
 // 7

Чтобы удалить элемент в начале очереди, используйте метод dequeue() следующим образом:

// dequeue all elements
while(!q.isEmpty()) {
    console.log(q.dequeue());
}

Все это вместе:

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());
}
Рейтинг
( Пока оценок нет )
Александр Русаков / автор статьи
Программист, разработчик, 12 лет опыта работы в крупных компаниях. Быстро освоил typescript, делюсь своими знаниями на страницах этого сайта.
Загрузка ...
JavaScript и TypeScript