当前位置: 首页 > 知识库问答 >
问题:

队列使用2个堆栈,在O(1)中删除

艾泉
2023-03-14

我在Java中使用2个堆栈实现了一个队列,我遵循以下算法:

排队(x)
将x推到堆栈1

deQueue()
1)如果两个堆栈都为空,则返回错误
2)如果stack2为空,而stack1不为空,则将所有内容从stack1推到stack2
3)从stack2弹出元素并返回它。

现在,这里的问题是第一个deQueue()操作非常慢(因为它将所有内容传输到stack2)。我们可以修改算法,使deQueue总是O(1)吗?还有其他选择吗?

共有3个答案

华化
2023-03-14

当我们说first deQueue()操作非常慢(因为它将所有内容都传输到stack2)

我假设我们正在谈论这个

2) 如果stack2为空,而stack1不为空,则将所有内容从stack1推到stack2。

我们只是简单地将stack1中的所有内容按相同的顺序转移到stack2吗。这将是简单的赋值(stack2=stack1;),因此O(1)。

或者,如果我们说需要从stack1中逐个弹出所有内容,然后添加到stack2。我们基本上是在讨论反转列表(stack1),然后分配给stack2(我们知道分配是O(1))。有各种好的算法可以反转列表http://www.codeproject.com/Articles/27742/How-To-Reverse-a-Linked-List-3-Different-Ways.

如果您使用Java(根据标记),您可以简单地使用Collections.reverse(arrayList);来反转列表。

荣轶
2023-03-14

我会咬:为什么不用双向链表?这应该是O(1)推和O(1)弹出。

子车灿
2023-03-14

您可以交换这两个堆栈。

查询队列

  1. 如果两个堆栈是空的,则出错。
  2. 如果stack2是空的,而stack1不是空的,交换两个堆栈。
  3. 从stack2弹出元素并返回它。

使用交换时,操作始终为O(1)

如果需要FIFO队列,请使用两个队列。只有在需要后进先出行为时才使用堆栈。

如果是这种情况,那么使用一个队列或两个队列之间没有区别,因此您也可以只使用一个队列。如果您使用的是线程,请使用ExecutorService包装队列和线程池。

 类似资料:
  • 为什么我的代码在运行时会被粉碎。它表示在Push()函数中传递不兼容的指针类型。如何解决这个问题? 下面是我用C语言实现的代码。下面是我如何尝试解决这个问题的简要总结。 >

  • 数字键盘字母组合问题[M]

  • 我正在为我的考试做复习,我遇到了这个问题,我需要在执行以下代码后找到Q1的内容。 数据 普塞多密码 这是我的解决方案 > 如果数字不是0,则将数字推送到堆栈,使堆栈现在变为0 否则,弹出堆栈的前两个元素,因此现在堆栈变为 3.循环堆栈!清空,弹出堆栈并在Q1中排队。所以现在堆栈为空,队列变为空 33是队列中的第一个,5是队列中的最后一个。 我仔细核对了提供的答案,发现我的答案不同 提供的答案 我不

  • 我用数组在GeeksforGeeks上试过这个问题。但是GeeksforGeeks中的解决方案说,我们必须使用链表来删除堆栈的中间元素,时间复杂度为O(1)。但我也有一个使用数组的解决方案,我想确认它是否正确。删除中间元素的解决方案是:- null 如果堆栈元素的no小于3,只需从堆栈中删除最上面的元素即可。我认为这个解决方案的时间复杂度也为O(1),因为这里没有循环运行。那么有人能说出这是不是这

  • 2. 堆栈 在第 3 节 “递归”中我们已经对堆栈这种数据结构有了初步认识。堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问a[5]下次可以访问a[1],但是堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。如果所有元素的类型相同,堆栈的存

  • 我有一个包含n个元素的队列,前面是。我需要创建一个堆栈,上面有。 它只能通过排队、退队、推送和弹出以及持续存储来完成。与其说我需要一个答案,不如说我需要一个如何解决这个问题的想法。 请不要为我回答这个问题,但是请试着理解我是编程新手,我可以用一个想法来解决这个问题。 这是一种类似河内塔楼的方式吗 这只需要一个恒定的存储空间吗 这不是家庭作业,我只是需要一些关于如何进行的建议。我的第一个想法是,倒转