Pile, foreach, mauvais ordre?

Lors de l’utilisation de Java for chaque syntaxe, Stack n’utilise pas de commande LIFO sur les éléments en sortie. Considérons le code suivant:

 import java.util.Queue; import java.util.Stack; import java.util.LinkedList; public class QueueStackTest { private static int[] numbers = {1, 2, 3, 4, 5}; public static void main(Ssortingng[] args) { Stack s = new Stack(); Queue l = new LinkedList(); for (int i : numbers) { s.push(i); l.offer(i); } System.out.println("Stack: "); for(Integer i : s) { System.out.println(i); } System.out.println(); System.out.println("Queue:"); for(Integer i : l) { System.out.println(i); } } } 

Sortie:

 Stack: 1 2 3 4 5 Queue: 1 2 3 4 5 

Des questions:

  1. Est-ce que ça a du sens? Est-ce un bug?
  2. Puis-je garantir que cela restituera au moins les éléments de la queue dans le bon ordre?
  3. Lors de la consommation (traitement) d’une Stack ou d’une Queue , est-ce la meilleure façon de le faire? Ou devrais-je faire une boucle plus manuelle avec quelque chose comme: while(!s.isEmpty()) { handle(s.pop()); } while(!s.isEmpty()) { handle(s.pop()); } ou while(!l.isEmpty()) { handle(l.poll()); } while(!l.isEmpty()) { handle(l.poll()); }

    Il y a une note de bas de page intéressante dans Javadoc de Stack :

    Un ensemble plus complet et cohérent d’opérations de stack LIFO est fourni par l’interface de Deque et ses implémentations, qui doivent être utilisées de préférence à cette classe. Par exemple:

    Deque stack = new ArrayDeque ();

    Une version étendue de votre programme:

      public static void main(Ssortingng[] args) { Stack s = new Stack(); Deque d = new ArrayDeque(); Queue l = new LinkedList(); for (int i : numbers) { s.push(i); l.offer(i); d.push(i); } System.out.println("Stack: "); for(Integer i : s) { System.out.println(i); } System.out.println(); System.out.println("Queue:"); for(Integer i : l) { System.out.println(i); } System.out.println(); System.out.println("Deque:"); for(Integer i : d) { System.out.println(i); } } 

    donne

     .... Deque: 5 4 3 2 1 

    Alors peut-être passer à Deque pour un comportement plus cohérent.

    Vous devez utiliser pop () & poll () au lieu de pour la boucle. C’est l’API offerte par Stack / Queue.

    Lorsque vous effectuez une itération, vous répétez directement la représentation interne de Stack / Queue.