J'ai la question de devoirs suivante:
Implémentez les méthodes de pile push (x) et pop () à l'aide de deux files d'attente.
Cela me semble étrange parce que:
- Une pile est une file d'attente (LIFO)
- Je ne vois pas pourquoi vous auriez besoin de deux files d'attente pour le mettre en œuvre
J'ai cherché autour de:
et trouvé quelques solutions. C'est ce que j'ai fini avec:
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;
}
}
Mais je ne comprends pas l’avantage de l’utilisation d’une seule file; la version à deux files d'attente semble inutilement compliquée.
Supposons que nous choisissions les poussées comme étant les plus efficaces des 2 (comme je l’ai fait ci-dessus), push
resterions les mêmes et pop
exigeraient simplement une itération au dernier élément, puis le retourner. Dans les deux cas, le push
serait O(1)
et le pop
serait O(n)
; mais la version à file d'attente unique serait considérablement plus simple. Cela ne devrait nécessiter qu'une seule boucle for.
Est-ce que je manque quelque chose? Toute idée ici serait appréciée.