Проблема в том, что ваша реализация имеет O (n) сложность времени для dequeue
КАЖДОГО времени, потому что вы звоните shift
.С другой стороны, pop
является операцией O (1).Для более подробной информации, вы можете проверить этот вопрос .
Обратите внимание, что в вашей реализации вы можете в значительной степени избавиться от stack2
в целом, и он все равно будет работать (конечно, с тем же недостатком, что у вас будет O (n) dequeue
):
class QueueTwoStacks {
constructor() {
this.stack1 = []
// this.stack2 = []
}
enqueue(item) {
this.stack1.push(item)
// const lastItem = this.stack1.pop()
// this.stack2.push(lastItem)
// const lastItem2 = this.stack2.pop()
// this.stack1.push(lastItem2)
}
dequeue() {
if(this.stack1.length === 0) throw Error
return this.stack1.shift();
}
}
Вторая реализация, однако, только изредка перемещает элементы в outStack
(т.е. только когда он пуст) и использует pop
для своей операции dequeue
.Таким образом, хотя наихудшим случаем по-прежнему является O (n), в среднем случае dequeue
в этой реализации должно быть O (1), что значительно лучше, чем O (n), особенно если вы собираетесь его вызыватьмного раз.