Geschiedenis van de vraag:
De verzamelingen Queue en Stack zijn basisgegevensstructuren die respectievelijk de principes FIFO (First-In-First-Out) en LIFO (Last-In-First-Out) implementeren. Ze worden al actief gebruikt sinds de klassieke VB6-periode, en met de komst van VB.NET zijn deze structuren standaardklassen geworden. Queue is nuttig voor scenario's waarin elementen in de volgorde van binnenkomst moeten worden verwerkt (bijvoorbeeld een takenlijst), terwijl Stack wordt gebruikt wanneer het laatst toegevoegde element eerder moet worden verwerkt dan de anderen (bijvoorbeeld een oproepstapel of om acties ongedaan te maken).
Probleem:
Vaak wordt onterecht niet de juiste structuur gekozen voor een bepaalde taak of worden ze onveilig gebruikt in multithreadscenario's. Ook komen er fouten voor bij het ophalen van een lege stack of queue, wat uitzonderingen veroorzaakt.
Oplossing:
In Visual Basic zijn er de volgende klassen voor het werken met deze structuren:
System.Collections.QueueSystem.Collections.StackVoorbeeld van het werken met een wachtrij en stapel:
' Werk met wachtrij Dim q As New Queue() q.Enqueue("Eerste") q.Enqueue("Tweede") Dim item = q.Dequeue() ' item = "Eerste" ' Werk met stapel Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
Kernpunten:
1. Mag je de collectie Queue of Stack wijzigen tijdens het itereren met For Each?
Nee, het wijzigen (toevoegen of verwijderen van elementen) van de collectie tijdens iteratie met For Each leidt tot InvalidOperationException.
Voorbeeldcode:
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' veroorzaakt een uitzondering tijdens iteratie Next
2. Wat geeft de methode Peek() terug voor een lege Queue of Stack?
Peek werpt een InvalidOperationException-exceptie als de collectie leeg is, in plaats van een standaardwaarde terug te geven.
Voorbeeldcode:
Dim st As New Stack() Dim first As Object = st.Peek() ' Exception!
3. Wat is het verschil tussen Queue(Of T) en Queue en waarom moet je de voorkeur geven aan generieke collecties?
Queue(Of T) is de generieke versie van Queue, die typeveilig is en boxing/unboxing voorkomt. Het is beter om deze altijd te kiezen bij het werken met bekende types.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Alleen Integer
In een toepassing waar een documentafdrukwachtrij is geïmplementeerd, slaat de ontwikkelaar drukopdrachten op in een Stack in plaats van in een Queue. Als gevolg hiervan worden documenten in omgekeerde volgorde afgedrukt (de laatst toegevoegde worden als eerste verwerkt).
Voordelen:
Nadelen:
Datzelfde project wijzigt Stack naar Queue voor het opslaan van drukopdrachten. Nu worden documenten in volgorde van links naar rechts afgedrukt, zoals de gebruiker verwacht.
Voordelen:
Nadelen: