我有以下作业问题:
使用两个队列实现堆栈方法push(x)和pop()。
我觉得这很奇怪,因为:
- 堆栈是(LIFO)队列
- 我不明白为什么您需要两个队列来实现它
我到处搜寻:
并找到了一些解决方案。我最终得到的是:
public class Stack<T> {
LinkedList<T> q1 = new LinkedList<T>();
LinkedList<T> q2 = new LinkedList<T>();
public void push(T t) {
q1.addFirst(t);
}
public T pop() {
if (q1.isEmpty()) {
throw new RuntimeException(
"Can't pop from an empty stack!");
}
while(q1.size() > 1) {
q2.addFirst( q1.removeLast() );
}
T popped = q1.pop();
LinkedList<T> tempQ = q1;
q1 = q2;
q2 = tempQ;
return popped;
}
}
但是我不了解使用单个队列的好处是什么;两个队列版本似乎毫无意义地复杂。
假设我们选择2的效率更高(如我上面所做的那样),push
将保持不变,并且pop
只需要迭代到最后一个元素并返回它。在两种情况下,“ push
将是O(1)
”和“ pop
将是” O(n)
;但单队列版本将大大简化。它只需要一个for循环。
我想念什么吗?这里的任何见解将不胜感激。