Queue/Definition: Difference between revisions

Content added Content deleted
m (Added Nimrod code)
No edit summary
Line 977: Line 977:
(pop (queue-items queue))))</lang>
(pop (queue-items queue))))</lang>


=={{header|Component Pascal}}==
BlackBox Component Builder
<lang oberon2>
MODULE Queue;
IMPORT StdLog,Boxes;

TYPE
Queue* = POINTER TO RECORD
first,last: LONGINT;
queue: POINTER TO ARRAY OF Boxes.Object;
END;
PROCEDURE NewQueue*(cap: LONGINT): Queue;
VAR
q: Queue;
BEGIN
NEW(q);q.first := 0; q.last := 0;
NEW(q.queue,cap);
RETURN q
END NewQueue;
PROCEDURE (q: Queue) IsEmpty*(): BOOLEAN, NEW;
VAR
BEGIN
RETURN (q.first = q.last)
END IsEmpty;
PROCEDURE (q: Queue) Push*(o: Boxes.Object),NEW;
VAR
i,j,oldSize,newSize: LONGINT;
queue: POINTER TO ARRAY OF Boxes.Object;
BEGIN
IF q.IsEmpty() THEN
q.queue[q.last] := o;
q.last := (q.last + 1) MOD LEN(q.queue)
ELSE
q.queue[q.last] := o;
q.last := (q.last + 1) MOD LEN(q.queue);
IF q.first = q.last THEN
(* grow queue *)
newSize := LEN(q.queue) + (LEN(q.queue) DIV 2);
(* new queue*)
NEW(queue,newSize);
(* move data from old queue to new queue *)
i := q.first; j := 0;oldSize := LEN(q.queue) - q.first + q.last;
WHILE (j < oldSize ) & (j < LEN(queue) - 1) DO
queue[j] := q.queue[i];
i := (i + 1) MOD LEN(q.queue);INC(j)
END;
q.queue := queue;q.first := 0;q.last := j
END
END;
END Push;
PROCEDURE (q: Queue) Pop*(): Boxes.Object, NEW;
VAR
o: Boxes.Object;
BEGIN
ASSERT(~q.IsEmpty());
o := q.queue[q.first];
q.queue[q.first] := NIL;
q.first := (q.first + 1) MOD LEN(q.queue);
RETURN o;
END Pop;

END Queue.
</lang>
Interface extracted from implementation
<lang oberon2>
DEFINITION Queue;

IMPORT Boxes;

TYPE
Queue = POINTER TO RECORD
(q: Queue) IsEmpty (): BOOLEAN, NEW;
(q: Queue) Pop (): Boxes.Object, NEW;
(q: Queue) Push (o: Boxes.Object), NEW
END;

PROCEDURE NewQueue (cap: LONGINT): Queue;

END Queue.
</lang>
=={{header|D}}==
=={{header|D}}==
See code here: http://rosettacode.org/wiki/Queue/Usage#D
See code here: http://rosettacode.org/wiki/Queue/Usage#D