Tengo la siguiente pregunta de tarea:
Implemente los métodos de pila push (x) y pop () usando dos colas.
Esto me parece extraño porque:
- Una pila es una cola (LIFO)
- No veo por qué necesitarías dos colas para implementarlo
Busqué alrededor:
y encontré un par de soluciones. Esto es lo que terminé con:
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;
}
}
Pero no entiendo cuál es la ventaja sobre el uso de una sola cola; la versión de dos colas parece inútilmente complicada.
Digamos que elegimos que los empujes sean los más eficientes de los 2 (como hice anteriormente), push
seguirían siendo los mismos y pop
simplemente requerirían iterar hasta el último elemento y devolverlo. En ambos casos, el push
sería O(1)
y el pop
sería O(n)
; pero la versión de cola única sería drásticamente más simple. Solo debería requerir un solo bucle for.
¿Me estoy perdiendo de algo? Cualquier idea aquí sería apreciada.