CARD EndProg ;required for ALLOCATE.ACT INCLUDE "D2:ALLOCATE.ACT" ;from the Action! Tool Kit. You must type 'SET EndProg=*' from the monitor after compiling, but before running this program! DEFINE PTR="CARD" DEFINE NODE_SIZE="5" TYPE QueueNode=[ BYTE priority PTR data ;CHAR ARRAY PTR nxt] QueueNode POINTER queueFront,queueRear BYTE FUNC IsEmpty() IF queueFront=0 THEN RETURN (1) FI RETURN (0) PROC Push(BYTE p CHAR ARRAY d) QueueNode POINTER node,curr,prev node=Alloc(NODE_SIZE) node.priority=p node.data=d node.nxt=0 IF IsEmpty() THEN queueFront=node queueRear=node RETURN FI curr=queueFront prev=0 WHILE curr#0 AND curr.priority<=p DO prev=curr curr=curr.nxt OD IF prev=0 THEN queueFront=node ELSEIF curr=0 THEN queueRear.nxt=node queueRear=node ELSE prev.nxt=node FI node.nxt=curr RETURN PTR FUNC Pop() QueueNode POINTER node IF IsEmpty() THEN PrintE("Error: queue is empty!") Break() FI node=queueFront queueFront=node.nxt RETURN (node) PROC TestIsEmpty() IF IsEmpty() THEN PrintE("Queue is empty") ELSE PrintE("Queue is not empty") FI RETURN PROC TestPush(BYTE p CHAR ARRAY d) PrintF("Push priority=%B task=%S%E",p,d) Push(p,d) RETURN PROC TestPop() QueueNode POINTER node node=Pop() PrintF("Pop priority=%B task=%S%E",node.priority,node.data) Free(node,NODE_SIZE) RETURN PROC Main() AllocInit(0) queueFront=0 queueRear=0 Put(125) PutE() ;clear screen TestIsEmpty() TestPush(3,"Clear drains") TestPush(4,"Feed cat") TestPush(5,"Make tea") TestPush(1,"Solve RC tasks") TestPush(2,"Tax return") TestIsEmpty() TestPop() TestPop() TestPop() TestPop() TestPop() TestIsEmpty() RETURN