Добавляйте элементы в первый стек. При извлечении, если второй пуст, переложите в него элементы первого: их порядок развернётся в FIFO.
Имплементация очереди с использованием двух стеков
Добавляйте элементы в первый стек. При извлечении, если второй пуст, переложите в него элементы первого: их порядок развернётся в FIFO.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо создать структуру данных — очередь, реализованную при помощи двух стеков, которые будут служить внутренним хранилищем. При этом операции добавления и удаления элементов должны работать в соответствии с принципом FIFO.
class Stack {
constructor() {
this.storage = [];
}
push(data) {
this.storage.push(data);
}
pop() {
return this.storage.pop();
}
size() {
return this.storage.length;
}
}
class Queue {
constructor() {
this.stack1 = new Stack();
this.stack2 = new Stack();
}
// Добавить в очередь
enqueue(data)
Ответ
Добавляйте элементы в первый стек. При извлечении, если второй пуст, переложите в него элементы первого: их порядок развернётся в FIFO.
Используя Stack из условия:
class Queue {
constructor() { this.stack1 = new Stack(); this.stack2 = new Stack(); }
enqueue(data) { this.stack1.push(data); }
dequeue() {
if (this.stack2.size() === 0) {
while (this.stack1.size() > 0) this.stack2.push(this.stack1.pop());
}
return this.stack2.pop();
}
size() { return this.stack1.size() + this.stack2.size(); }
}
Пустая очередь возвращает undefined. Каждая запись перекладывается не более одного раза: операции имеют амортизированную O(1) стоимость, хотя одно извлечение может занять O(n).