是否可以在一个堆栈中实现多个队列?
Posted
技术标签:
【中文标题】是否可以在一个堆栈中实现多个队列?【英文标题】: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++
,但这似乎不正确,请添加正确的语言标签
【参考方案1】:
您使用两个堆栈,一个用于队列的前面,一个用于队列的后面。前堆栈的顺序是要出列的第一个元素在顶部,之后的第二个,依此类推。后堆栈的顺序是使您排队的最后一个元素在顶部,前一个在下一个,依此类推。
当你需要将一个元素加入队列时,你只需将它推入后台堆栈即可。
当你需要出列一个元素,并且前栈不为空时,弹出第一个元素。
当您需要将元素出列并且前堆栈为空时,就会出现问题。然后你必须将所有元素从后面移动到前面。您从后面弹出它们并将它们推到前面,一次一个。
此过程反转后队列中元素的顺序。您从后面弹出的元素被推到前面的元素之上。因此,在此之后,前面的堆栈按照不变量要求的方式进行排序。
前两种情况显然是常数时间(任何合理的堆栈实现)。第三个更昂贵,因为它可能涉及大量复制。然而,我们可以争论一个摊销的常数时间。每个元素只从后到前移动一次,所以每次将一个元素入队时,在摊销银行里放一个硬币,然后它可以支付将元素移到前面的费用。
【讨论】:
以上是关于是否可以在一个堆栈中实现多个队列?的主要内容,如果未能解决你的问题,请参考以下文章
是否有一个选项或命令可用于禁用/卸载/或停止 linux 中的 tcp/IP 堆栈。需要它在服务器应用程序中实现用户空间 tcp