Как реализовать очередь с использованием стека в JavaScript: два подхода

Чтобы реализовать очередь с использованием стека в JavaScript, вы можете использовать несколько методов. Вот несколько подходов:

Метод 1: использование двух стопок

  • Создайте две стопки, назовем их «Входящие» и «Исходящие».
  • Для операции постановки в очередь (добавления элемента в очередь) просто поместите элемент в стек «Входящие».
  • Для операции удаления из очереди (удаления элемента из очереди) проверьте, пуст ли стек «Исходящие».
    • Если он не пуст, извлеките верхний элемент из стека «Исходящие» и верните его.
    • Если он пуст, перенесите все элементы из стека «Входящие» в стек «Исходящие», извлекая элементы из «Входящие» и помещая их в «Исходящие». Затем извлеките верхний элемент из папки «Исходящие» и верните его.

Вот пример реализации:

class Queue {
  constructor() {
    this.inbox = [];
    this.outbox = [];
  }
  enqueue(item) {
    this.inbox.push(item);
  }
  dequeue() {
    if (this.outbox.length === 0) {
      while (this.inbox.length > 0) {
        this.outbox.push(this.inbox.pop());
      }
    }
    return this.outbox.pop();
  }
  isEmpty() {
    return this.inbox.length === 0 && this.outbox.length === 0;
  }
  size() {
    return this.inbox.length + this.outbox.length;
  }
}

Метод 2: использование одного стека

  • Создайте стек и переменную для хранения первого элемента очереди.
  • Для постановки в очередь просто поместите элемент в стек.
  • Для операции удаления из очереди, если стек пуст, верните значение null (или при необходимости выдайте ошибку). В противном случае рекурсивно извлекайте элементы из стека, пока не будет достигнут последний элемент. Установите переменную переднего элемента на этот последний элемент, а затем верните его. Наконец, отодвиньте все выдвинутые элементы.

Вот пример реализации:

class Queue {
  constructor() {
    this.stack = [];
    this.front = null;
  }
  enqueue(item) {
    this.stack.push(item);
    this.front = item;
  }
  dequeue() {
    if (this.stack.length === 0) {
      return null; // Or throw an error
    }
    if (this.stack.length === 1) {
      this.front = null;
      return this.stack.pop();
    }
    const item = this.stack.pop();
    const dequeuedItem = this.dequeue();
    this.stack.push(item);
    return dequeuedItem;
  }
  isEmpty() {
    return this.stack.length === 0;
  }
  size() {
    return this.stack.length;
  }
}