Een queue is een wachtrij-achtige datastructuur die elementen opslaat volgens het FIFO-principe (First In, First Out). Het eerst toegevoegde element wordt als eerste weer verwijderd. Denk aan een rij bij de kassa: de eerste klant die aanschuift, is ook de eerste die wordt geholpen.
Casus
Stel je voor dat je een printsysteem ontwikkelt voor een kantoor. Printopdrachten komen in willekeurige volgorde binnen, maar moeten netjes in de volgorde van binnenkomst afgehandeld worden. Een queue garandeert dat elke opdracht in de volgorde waarin deze werd aangevraagd, wordt verwerkt, zodat geen enkele printjob “onderaan” blijft liggen.
Hoe zit een queue in elkaar?
Een queue kent vier kernoperaties:
Enqueue: voegt een nieuw element toe aan het einde (achterkant) van de wachtrij.
Dequeue: verwijdert en retourneert het voorste element van de wachtrij.
Count: geeft het aantal elementen in de queue terug.
Peek: bekijkt het voorste element zonder het te verwijderen.
Codevoorbeeld
Queue<string> wachtrij = new Queue<string>();
// Drukopdrachten in de wachtrij zetten
wachtrij.Enqueue("PrintDocument1.pdf");
wachtrij.Enqueue("Photo.png");
wachtrij.Enqueue("Report.docx");
// Het verwijderen van het eerste document
wachtrij.Dequeue(); // Verwijderd PrintDocument1.pdf
De dataflow in een queue volgt altijd van voorkant naar achterkant. Nieuwe elementen schuiven achteraan aan, en verwijderingen vinden altijd vooraan plaats.
flowchart LR
subgraph Queue
direction LR
Ingang((Enqueue)) --> A[Item1] --> B[Item2] --> C[Item3] --> Uitgang((Dequeue))
end
Hoe gebruik je een queue?
De queue komt van pas zodra je taken, gebeurtenissen of berichten in volgorde van binnenkomst wilt afhandelen:
Task scheduling: je plant taken achtereenvolgens in, bijvoorbeeld in een taakplanner of job-scheduler.
Buffers en streaming: video- of audio-buffers gebruiken een queue om data in de juiste volgorde te decoderen en af te spelen.
Breadth-First Search (BFS) in grafen: een queue houdt bij welke knooppunten je nog moet onderzoeken.
Casus
Stel dat je door gaat met ontwikkelen van het printsysteem. Je wilt dat documenten die het eerste bij de printer aankomen, ook het eerste worden geprint. Hiervoor besluit je om een queue te gebruiken zodat de documenten volgens het FIFO principe worden verwerkt.
Mogelijke uitwerking van de casus
// Een nieuwe queue voor stringsQueue<string> wachtrij = new Queue<string>();// Drukopdrachten in de wachtrij zettenwachtrij.Enqueue("PrintDocument1.pdf");wachtrij.Enqueue("Photo.png");wachtrij.Enqueue("Report.docx");// Voorste opdracht bekijkenConsole.WriteLine($"Eerste in rij: {wachtrij.Peek()}");// Taken verwerkt: dequeuewhile (wachtrij.Count > 0){ string opdracht = wachtrij.Dequeue(); Console.WriteLine($"Verwerk: {opdracht}");}// Output:// Eerste in rij: PrintDocument1.pdf// Verwerk: PrintDocument1.pdf// Verwerk: Photo.png// Verwerk: Report.docx
TIP
Controleer altijd met Count > 0 of de queue niet leeg is voordat je Dequeue aanroept om runtime-fouten te voorkomen.
Gebruik Peek voor “insluiping”: je kunt dan een element bekijken zonder de volgorde te verstoren.