Чтобы реализовать очередь с использованием стека в 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;
}
}