Tenho a seguinte pergunta de lição de casa:
Implemente os métodos de pilha push (x) e pop () usando duas filas.
Isso me parece estranho porque:
- Uma pilha é uma fila (LIFO)
- Não vejo por que você precisaria de duas filas para implementá-lo
Eu procurei em torno de:
e encontrou algumas soluções. Foi assim que acabei:
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;
}
}
Mas não entendo qual é a vantagem de usar uma única fila; a versão de duas filas parece sem sentido complicada.
Digamos que escolhemos que os impulsos sejam os mais eficientes dos 2 (como fiz acima), push
permaneceriam os mesmos e pop
exigiriam simplesmente iteração para o último elemento e retorno. Nos dois casos, o push
seria O(1)
e o pop
seria O(n)
; mas a versão de fila única seria drasticamente mais simples. Deve exigir apenas um único loop for.
Estou esquecendo de algo? Qualquer visão aqui seria apreciada.