bfe.dev 是一个针对前端的刷题网站,像是前端的LeetCode。该系列文章是我在下面的刷题日记。
题目108
BFE.dev#108 利用队列(Queue)实现栈(Stack)
剖析
假如咱们有一个队列
[1,2,3,4]
如果咱们要pop
4的话,因为这是一个队列,咱们只能把1 dequeue掉。所以为了要失去4,咱们必须要把其余的1,2,3给dequeue掉。dequeue掉的元素因为只能用队列,所以须要用第二个队列来装。比方这样:
[4], [1,2,3]
当初咱们能够获得4了。
[ ] , [1,2,3]
这时候咱们能够把1,2,3放回去。然而这会让peek()
的实现比拟麻烦,因为单纯为了peek()
也要反复上述操作的话,太节约了。
为了解决这个问题,咱们能够好好利用这两个queue,让其中一个queue始终只有一个元素。比方。
[ ], [ ]
当初增加1,咱们须要enqueue即可。
[1], [ ]
增加2,enqueue过后,咱们放弃第一个queue只有一个元素,所以把1放入第二个queue。
[1,2], [ ][2], [1]
增加3和4的时候,反复雷同操作。
[2,3], [1][3], [1,2][3,4], [1,2][4], [1,2,3]
当初咱们能够dequeue 4了。
[ ], [1,2,3]
因为第一个queue成了空,咱们能够尝试让第二个queue蕴含只有一个元素。
[1,2], [3]
当初咱们能够替换两个queue的位置,这样就变成了和之前齐全一样的状态。
[3], [1, 2]
OK,综上所述,咱们只须要有两个queue。
queue1
始终保持只有一个元素(或者初始都为空的状态)queueRest
用来寄存其余的元素
来,代码写起来
如下代码齐全是依照上述想法的复现,就不再阐明了。
class Stack { constructor() { this.queue1 = new Queue() this.queueRest = new Queue() } push(element) { this.queue1.enqueue(element) this._move() } _move() { while (this.queue1.size() > 1) { this.queueRest.enqueue(this.queue1.dequeue()) } } peek() { return this.queue1.peek() } pop() { if (this.queue1.size() === 0) { return undefined } const element = this.queue1.dequeue() // swap if the other queue is not empty if (this.queueRest.size() > 0) { ;[this.queue1, this.queueRest] = [this.queueRest, this.queue1] this._move() } return element } size() { return this.queue1.size() + this.queueRest.size() }}
通过,撒花!
如果你感兴趣能够去BFE.dev 试试 https://bigfrontend.dev/zh/pr...
感激浏览,心愿有所帮忙,下次见!