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

时间:2012-08-21 18:33:22

标签: java algorithm data-structures

我在Java中使用2个堆栈实现了一个Queue,我遵循这个算法:

  

入列(x)的
  将x推送到stack1

     

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

现在,问题是第一个deQueue() 操作非常慢(因为它将所有内容都转移到stack2)。我们能以某种方式修改算法,以便deQueue总是O(1)吗?还有其他选择吗?

3 个答案:

答案 0 :(得分:0)

您可以交换两个堆栈。

出队()

  1. 如果两个堆栈都为空,则出错。
  2. 如果stack2为空,则为 stack1不为空,交换两个堆栈。
  3. 弹出元素 stack2并将其返回。
  4. 使用交换,操作始终为O(1)

    如果需要FIFO队列,请使用两个队列。如果您需要LIFO行为,请仅使用堆栈。

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

答案 1 :(得分:0)

我会咬人:为什么不使用双向链表呢?这应该是O(1)push和O(1)pop。

答案 2 :(得分:0)

当我们说first deQueue() operation is very slow (since it transfers everything to stack2).

我假设我们正在谈论这个

  

2)如果stack2为空而stack1不为空,则从中推送所有内容   stack1 to 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);来反转列表。