Ho la seguente domanda per i compiti:
Implementare i metodi stack push (x) e pop () usando due code.
Mi sembra strano perché:
- Uno stack è una coda (LIFO)
- Non vedo perché occorrano due code per implementarlo
Ho cercato in giro:
e ho trovato un paio di soluzioni. Questo è quello che ho finito 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;
}
}
Ma non capisco quale sia il vantaggio rispetto all'utilizzo di una singola coda; la versione a due code sembra inutilmente complicata.
Supponiamo che scegliamo che i push siano i più efficienti dei 2 (come ho fatto sopra), push
rimarrebbero gli stessi e pop
richiederebbero semplicemente di ripetere l'ultimo elemento e di restituirlo. In entrambi i casi, push
sarebbe O(1)
e pop
sarebbe O(n)
; ma la versione a coda singola sarebbe drasticamente più semplice. Dovrebbe richiedere solo un singolo ciclo.
Mi sto perdendo qualcosa? Qualsiasi approfondimento qui sarebbe apprezzato.