Wat is een queue?

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 strings
Queue<string> wachtrij = new Queue<string>();
 
// Drukopdrachten in de wachtrij zetten
wachtrij.Enqueue("PrintDocument1.pdf");
wachtrij.Enqueue("Photo.png");
wachtrij.Enqueue("Report.docx");
 
// Voorste opdracht bekijken
Console.WriteLine($"Eerste in rij: {wachtrij.Peek()}");
 
// Taken verwerkt: dequeue
while (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.

Volgende stap: Stappen Queue