Ich habe folgende Hausaufgabenfrage:
Implementieren Sie die Stack-Methoden push (x) und pop () in zwei Warteschlangen.
Das kommt mir merkwürdig vor, weil:
- Ein Stack ist eine (LIFO-) Warteschlange
- Ich verstehe nicht, warum Sie zwei Warteschlangen benötigen würden, um es zu implementieren
Ich habe gesucht:
und fand ein paar Lösungen. Dies ist, was ich am Ende mit:
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;
}
}
Aber ich verstehe nicht, was der Vorteil gegenüber der Verwendung einer einzelnen Warteschlange ist. Die Version mit zwei Warteschlangen scheint sinnlos kompliziert zu sein.
Angenommen, wir möchten, dass Pushs die effizientere der beiden sind (wie ich es oben getan habe), push
dass sie gleich bleiben und pop
dass wir einfach bis zum letzten Element iterieren und es zurückgeben müssen. In beiden Fällen push
wäre das O(1)
und das pop
wäre O(n)
; aber die Single Queue-Version wäre drastisch einfacher. Es sollte nur eine einzige for-Schleife erforderlich sein.
Vermisse ich etwas? Einsicht hier wäre dankbar.