MODULE Queue; IMPORT Read, Write; CONST size = 5; TYPE QueueArray = ARRAY size OF INTEGER; VAR queue: QueueArray; counter, slot, value: INTEGER; PROCEDURE AddElementAtEnd(v: INTEGER; VAR q: QueueArray); BEGIN IF counter = size THEN Write.String("Queue ist voll"); Write.Ln; ELSE q[slot] := v; INC(counter); slot := (slot + 1) MOD size; Write.String("Wert "); Write.Int(value, 2); Write.String(" wurde hinzugefuegt"); Write.Ln; END; END AddElementAtEnd; PROCEDURE RemoveFirstElement(VAR q: QueueArray); VAR index: INTEGER; BEGIN IF counter = 0 THEN Write.String("Queue ist leer"); Write.Ln; ELSE index := (slot - counter + size) MOD size; (* Achtung: "freie" Plaetze in der Queue * werden hier nicht wirklich geloescht, * sondern mit Nullen gefuellt. *) q[index] := 0; DEC(counter); Write.String("Platz"); Write.Int(index,2); Write.String(" wurde freigegeben"); Write.Ln; END; END RemoveFirstElement; PROCEDURE Ausgabe(q: QueueArray); VAR i: INTEGER; BEGIN Write.Ln; Write.String("Die Queue enthaelt nun folgende Werte:"); Write.Ln; i := 0; WHILE i < size DO Write.Int(q[i],3); INC(i); END; Write.Ln; Write.Ln; END Ausgabe; BEGIN Write.Ln; counter := 0; slot := 0; value := 3; AddElementAtEnd(value,queue); value := 7; AddElementAtEnd(value,queue); value := 2; AddElementAtEnd(value,queue); value := 1; AddElementAtEnd(value,queue); value := 5; AddElementAtEnd(value,queue); Ausgabe(queue); (* Queue ist voll *) value := 4; AddElementAtEnd(value,queue); RemoveFirstElement(queue); RemoveFirstElement(queue); (* Jetzt sind wieder 2 Plaetze frei *) Ausgabe(queue); value := 4; AddElementAtEnd(value,queue); value := 6; AddElementAtEnd(value,queue); Ausgabe(queue); Write.Ln; END Queue.