Mam następujące pytanie o pracę domową:
Zaimplementuj metody stosu push (x) i pop () przy użyciu dwóch kolejek.
Wydaje mi się to dziwne, ponieważ:
- Stos to kolejka (LIFO)
- Nie rozumiem, dlaczego potrzebujesz dwóch kolejek, aby go zaimplementować
Szukałem w okolicy:
i znalazłem kilka rozwiązań. Właśnie z tym skończyłem:
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;
}
}
Ale nie rozumiem, na czym polega przewaga nad pojedynczą kolejką; wersja z dwiema kolejkami wydaje się bezcelowo skomplikowana.
Powiedzmy, że wybraliśmy, aby pushy były bardziej wydajne z 2 (jak to zrobiłem powyżej), push
pozostałyby takie same i pop
po prostu wymagałyby iteracji do ostatniego elementu i zwrócenia go. W obu przypadkach push
byłoby O(1)
i pop
byłoby O(n)
; ale wersja z pojedynczą kolejką byłaby znacznie prostsza. Powinien wymagać tylko pojedynczej pętli for.
Czy coś brakuje? Każdy wgląd tutaj będzie mile widziany.