Historique de la question :
Les collections Queue et Stack sont des structures de données de base, mettant en œuvre respectivement les principes FIFO (First-In-First-Out) et LIFO (Last-In-First-Out). Elles sont utilisées depuis l'époque de VB6 classique, et avec l'arrivée de VB.NET, ces structures sont devenues des classes standards. Queue est utile pour les scénarios où les éléments doivent être traités dans l'ordre de leur arrivée (par exemple, une file d'attente de tâches), tandis que Stack est utilisé lorsque le dernier élément ajouté doit être traité avant les autres (par exemple, la pile d'appels ou l'annulation d'actions).
Problème :
On choisit souvent par erreur la mauvaise structure pour une tâche donnée ou on les utilise de manière non sécurisée dans des scénarios multithreads. Des erreurs peuvent également survenir lors de l'extraction d'une pile ou d'une file d'attente vide, entraînant des exceptions.
Solution :
En Visual Basic, il existe des classes correspondantes pour travailler avec ces structures :
System.Collections.QueueSystem.Collections.StackExemple de travail avec une file d'attente et une pile :
' Travail avec une file d'attente Dim q As New Queue() q.Enqueue("Premier") q.Enqueue("Deuxième") Dim item = q.Dequeue() ' item = "Premier" ' Travail avec une pile Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
Caractéristiques clés :
1. Peut-on modifier une collection Queue ou Stack pendant l'itération à l'aide de For Each ?
Non, modifier (ajouter ou supprimer des éléments) une collection lors de son parcours avec For Each entraîne une InvalidOperationException.
Exemple de code :
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' déclenchera une exception lors de l'itération Next
2. Que renvoie la méthode Peek() pour une Queue ou Stack vide ?
Peek lance une exception InvalidOperationException si la collection est vide, et ne renvoie pas de valeur par défaut.
Exemple de code :
Dim st As New Stack() Dim first As Object = st.Peek() ' Exception !
3. Quelle est la différence entre Queue(Of T) et Queue et pourquoi vaut-il mieux privilégier les collections génériques ?
Queue(Of T) est la version générique de Queue, elle est type-sûre et permet d'éviter le boxing/unboxing. Il est toujours préférable de choisir celle-ci lors de l'utilisation de types connus.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Seulement Integer
Dans une application où une file d'attente d'impression de documents est implémentée, le développeur stocke les tâches d'impression dans une Stack, plutôt que dans une Queue. En conséquence, les documents sont imprimés dans l'ordre inverse (le dernier ajouté est le premier à être servi).
Avantages :
Inconvénients :
Le même projet remplace Stack par Queue pour stocker les tâches d'impression. Maintenant, les documents sont imprimés en séquence de gauche à droite, comme l'utilisateur s'y attend.
Avantages :
Inconvénients :