我在Java中使用2个堆栈实现了一个Queue,我遵循这个算法:
入列(x)的
将x推送到stack1出队()
1)如果两个堆栈都是空的那么错误 2)如果stack2为空而stack1不为空,则将所有内容从stack1推送到stack2 3)从stack2中弹出元素并返回它。
现在,问题是第一个deQueue()
操作非常慢(因为它将所有内容都转移到stack2
)。我们能以某种方式修改算法,以便deQueue
总是O(1)吗?还有其他选择吗?
答案 0 :(得分:0)
您可以交换两个堆栈。
出队()
使用交换,操作始终为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);
来反转列表。