【问题标题】:Is it possible to implement multiple queues in a Stack?是否可以在一个堆栈中实现多个队列?
【发布时间】:2021-12-21 14:05:18
【问题描述】:

谁能给我解释一下如何在一个堆栈中实现多个队列

// implement stacks using plain arrays with push and pop functions

var Stack1 = [];

var Stack2 = [];

// implement enqueue method by using only stacks

// and the push and pop functions

function Enqueue(element) {

Stack1.push(element);

}

// implement dequeue method by pushing all elements

// from stack 1 into stack 2, which reverses the order

// and then popping from stack 2

function Dequeue() {

if (Stack2.length === 0) {

if (Stack1.length === 0) { return 'Cannot dequeue because queue is empty'; }

while (Stack1.length > 0) {

var p = Stack1.pop();

Stack2.push(p);

}

}

return Stack2.pop();

}

Enqueue('a');

Enqueue('b');

Enqueue('c');

Dequeue();

【问题讨论】:

  • 问题被标记为c++,但这似乎不正确,请添加正确的语言标签

标签: javascript data-structures queue stack


【解决方案1】:

您使用两个堆栈,一个用于队列的前面,一个用于队列的后面。前堆栈的顺序是要出列的第一个元素在顶部,之后的第二个,依此类推。后堆栈的顺序是使您排队的最后一个元素在顶部,前一个在下一个,依此类推。

当你需要将一个元素加入队列时,你只需将它推入后台堆栈即可。

当你需要出列一个元素,并且前栈不为空时,弹出第一个元素。

当您需要将元素出列并且前堆栈为空时,就会出现问题。然后你必须将所有元素从后面移动到前面。您从后面弹出它们并将它们推到前面,一次一个。

此过程反转后队列中元素的顺序。您从后面弹出的元素被推到前面的元素之上。因此,在此之后,前面的堆栈按照不变量要求的方式进行排序。

前两种情况显然是常数时间(任何合理的堆栈实现)。第三个更昂贵,因为它可能涉及大量复制。然而,我们可以争论一个摊销的常数时间。每个元素只从后到前移动一次,所以每次将一个元素入队时,在摊销银行里放一个硬币,然后它可以支付将元素移到前面的费用。

【讨论】:

    猜你喜欢
    • 2020-08-30
    • 2017-12-21
    • 2014-04-21
    • 2014-12-23
    • 2010-10-15
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多