Hintergrund:
Die Sammlungen Queue und Stack sind grundlegende Datenstrukturen, die jeweils die Prinzipien FIFO (First-In-First-Out) und LIFO (Last-In-First-Out) implementieren. Sie werden seit der klassischen VB6-Ära aktiv genutzt, und mit dem Erscheinen von VB.NET wurden diese Strukturen zu Standardklassen. Queue ist nützlich für Szenarien, in denen Elemente in der Reihenfolge ihrer Ankunft verarbeitet werden müssen (z. B. Aufgabenwarteschlange), während Stack nützlich ist, wenn das zuletzt hinzugefügte Element früher verarbeitet werden muss (z. B. Aufrufstapel oder Rückgängigmachen von Aktionen).
Problem:
Häufig wird fälschlicherweise die falsche Struktur für eine bestimmte Aufgabe ausgewählt oder sie werden in mehrfädigen Szenarien unsicher verwendet. Es gibt auch Fehler beim Entnehmen aus einem leeren Stapel oder einer leeren Warteschlange, was Ausnahmen zur Folge hat.
Lösung:
In Visual Basic gibt es entsprechende Klassen zur Arbeit mit diesen Strukturen:
System.Collections.QueueSystem.Collections.StackBeispiel für die Arbeit mit Warteschlange und Stapel:
' Arbeit mit Warteschlange Dim q As New Queue() q.Enqueue("Erster") q.Enqueue("Zweiter") Dim item = q.Dequeue() ' item = "Erster" ' Arbeit mit Stapel Dim s As New Stack() s.Push("A") s.Push("B") Dim top = s.Pop() ' top = "B"
Wesentliche Merkmale:
1. Kann man die Sammlung Queue oder Stack während der Iteration mit For Each ändern?
Nein, das Ändern (Hinzufügen oder Entfernen von Elementen) der Sammlung während der Durchlauf mit For Each führt zu einer InvalidOperationException.
Beispielcode:
Dim q As New Queue() q.Enqueue(1) q.Enqueue(2) For Each elem In q q.Enqueue(3) ' wird während der Iteration eine Ausnahme auslösen Next
2. Was gibt die Methode Peek() für einen leeren Queue oder Stack zurück?
Peek löst eine InvalidOperationException aus, wenn die Sammlung leer ist, und gibt keinen Standardwert zurück.
Beispielcode:
Dim st As New Stack() Dim first As Object = st.Peek() ' Ausnahme!
3. Was ist der Unterschied zwischen Queue(Of T) und Queue und warum sollte man generische Sammlungen bevorzugen?
Queue(Of T) ist die generische Version von Queue, sie ist typensicher und vermeidet Boxing/Unboxing. Man sollte sie immer wählen, wenn man mit bekannten Typen arbeitet.
Dim numbers As New Queue(Of Integer)() numbers.Enqueue(5) ' Nur Integer
In einer Anwendung, wo eine Druckwarteschlange implementiert ist, speichert der Entwickler Druckaufträge im Stack anstelle von Queue. Infolgedessen werden die Dokumente in umgekehrter Reihenfolge gedruckt (zuletzt hinzugefügte werden zuerst angesprochen).
Vorteile:
Nachteile:
Dasselbe Projekt ändert den Stack in eine Queue zur Speicherung der Druckaufträge. Jetzt werden die Dokumente der Reihe nach von links nach rechts gedruckt, wie der Benutzer es erwartet.
Vorteile:
Nachteile: