priority-queue
priority queue abstract data type
\ Priority Queue uh 2016-02-21
\ Items that we store in the priority queue are double cell entries.
\ First cell is priority, second cell is value or pointer to a larger
\ data structure.
: q-items ( n -- units ) 2 cells * ;
: q-item! ( x1 ... xn addr ) 2! ;
: q-item@ ( addr -- x1 ... xn ) 2@ ;
: q-item+ ( addr -- addr' ) 1 q-items + ;
\ Defining word Priority-Queue:
: Priority-Queue: ( maxsize -- )
\ { maxsize size item_0 item_1 ... item_size-1 }
\ ^q-start ^q-end
Create dup , 0 , q-items allot ;
\ First field holds maximum size of priority queue
: q-maxsize ( q -- max-size ) @ ;
\ Second field holds actual size of priority queue
: q-'size ( q -- 'size ) cell+ ;
: q-size ( q -- u ) q-'size @ ;
: q-empty? ( q -- f ) q-size 0= ;
: q-clear ( q -- ) 0 swap q-'size ! ;
: q-full? ( q -- ) dup q-size swap q-maxsize < 0= ;
\ throw values for priority queue exceptions
-5000 Constant #Q-UNDERFLOW
-5001 Constant #Q-OVERFLOW
: ?q-underflow ( q -- ) q-empty? IF #Q-UNDERFLOW throw THEN ;
: ?q-overflow ( q -- ) dup q-size swap q-maxsize < IF EXIT THEN #Q-OVERFLOW throw ;
\ The following cells hold the queue items
: q-start ( q -- addr ) 2 cells + ;
: q-end ( q -- addr ) \ address of 1st item beyond queue
dup q-start swap q-size q-items + ;
: q-drop ( q -- ) \ remove front item from queue
dup ?q-underflow
-1 over q-'size +!
dup >r q-start dup q-item+ swap r> q-size q-items cmove ;
: q@ ( q -- key val ) \ retrieve front item from queue
dup ?q-underflow dup >r q-start q-item@ r> q-drop ;
: q-find ( key q -- addr ) \ find address of first item with higher priority
dup q-end swap q-start ?DO ( key )
dup I q-item@ drop < IF drop I UNLOOP EXIT THEN
1 q-items +LOOP
drop 0 ;
: q-append ( key val q -- ) \ append item at end of queue
dup ?q-overflow
dup >r q-end q-item! 1 r> q-'size +! ;
: q! ( key val q -- ) \ store item in queue according to its priority
dup ?q-overflow
2 pick over q-find dup IF ( key val q addr ) \ insert item
over 1 swap q-'size +! dup >r dup q-item+ rot q-end over - cmove>
r> q-item!
EXIT
THEN
drop q-append
;
: q. ( q -- ) \ show text representation
cr ." <priority-queue adr='" dup 0 u.r ." ' max-size='" dup q-maxsize 0 u.r ." '>" cr
dup q-end swap q-start ?DO
I q-item@ swap
." <q-item key='" 0 u.r ." '"
." value='" 0 u.r ." '/>"
cr
1 q-items +LOOP
." </priority-queue>" ;
cr .( Priority Queue )
by UlrichHoffmann
Versions
Tags
ansforth94, forth-94, forth-2012, datastructure
Dependencies
None
Dependents
None