Queue Datenstruktur in C#

Eine Queue (Warteschlange) ist eine First-in-First-out-(FIFO) Datenstruktur.
Die Datenstruktur Queue ist ein Stapel, auf welchem nach und nach Daten abgelegt werden.
Allerdings wird auf Elemente der Queue nur von unten zugegriffen. Das unterste Element ist das mit höchster Priorität, nur auf dieses als erstes hinzugefügte Element kann zugegriffen werden.

Stack

Ein Pointer (Zeiger) zeigt intern immer auf das Element, welches (relativ zu den anderen Elementen) als erstes in die Queue aufgenommen wurde.
Ein einfaches “Lösche aus der Queue” gibt es nicht, ein Element kann aus der Queue mit Peek() herausgelesen und mit Dequeue() herausgelesen und zugleich entfernt werden.
An das Warteschlangenende angereiht werden Elemente mit Enqueue();

Funktionsweise einer Queue an Hand eines praktischen Beispiels:

Stellen Sie sich vor, Sie müssten eine Software für ein Theater schreiben. Die Software soll Ticket-Bestellungen für
Vorführungen bearbeiten. Nun sind die Vorstellungen aber sehr schnell ausgebucht, so dass viele Tickets nicht mehr ausgestellt werden können. Bei der Ticket-Bestellung gilt jedoch “wer zu erst kommt, mal zu erst”.
Die Daten aller eingehenden Bestellungen legen Sie in eine Queue (Warteschlange). Die Daten in der Queue werden vom ersten bis zum letzten Eintrag abgearbeitet, bis die Queue vollständig abgearbeitet wurde oder keine Plätze mehr verfügbar sind.

Beispielhafte Verwendung einer Queue in C#

Eine Queue wird mit der Klasse Queue angelegt. Die Queue benötigt jedoch die Information, von welchem Typ die zu speichernden Daten sein werden, diese werden mit spitzen Klammern angegeben.
Im Beispiel wird eine Queue angelegt, welche Strings speichern soll. Dabei wird seine Kapazität auf 500 Elemente beschränkt.

Diese Queue soll Bewerber auf Tickets für eine Theateraufführung speichern.

[csharp] Queue queue = new Queue(500);
[/csharp]

In einer ArrayList werden dafür 7 Beispiel-Bewerber eingetragen. Die Klasse ArrayList setzt using System.Collections vorraus.

[csharp] ArrayList applicants = new ArrayList();

applicants.AddRange(new string[] {
“Thomas”,
“Daniela”,
“David” ,
“Sarah”,
“Marion”,
“Friedarike”,
“Benjamin” });
[/csharp]

Die Bewerber werden in die Queue (Warteschlange) eingereiht:

[csharp] foreach (string applicant in applicants)
{
queue.Enqueue(applicant);
}
[/csharp]

Die Plätze sind jedoch begrenzt, nur 5 Tickets können vergeben werden.

[csharp] this.guests = new string[5];
[/csharp]

Eine Methode vergibt die Plätze nach dem Prinzip “Wer zu erst kommt, malt zu erst”. Die Elemente der Queue werden in das Array guests übertragen.

[csharp] private void EnterShow(Queue queue)
{
for (int i = 0; i <   this.guests.Length; i++) { this.guests[i] = queue.Dequeue(); } } [/csharp] In dem Beispiel können nicht alle Plätze vergeben werden, so dass die Personen "Friedarike" und "Benjamin" die Vorführung nicht sehen können und vorerst in der Warteschlange verbleiben müssen.