79 lines
1.9 KiB
OpenEdge ABL
79 lines
1.9 KiB
OpenEdge ABL
/* Priority queue (for simple text strings) */
|
|
|
|
enum message
|
|
{
|
|
text[40 char],
|
|
priority
|
|
}
|
|
|
|
main()
|
|
{
|
|
new msg[message]
|
|
|
|
/* insert a few items (read from console input) */
|
|
printf "Please insert a few messages and their priorities; \
|
|
end with an empty string\n"
|
|
for ( ;; )
|
|
{
|
|
printf "Message: "
|
|
getstring .string = msg[text], .maxlength = 40, .pack = true
|
|
if (strlen(msg[text]) == 0)
|
|
break
|
|
printf "Priority: "
|
|
msg[priority] = getvalue()
|
|
if (!insert(msg))
|
|
{
|
|
printf "Queue is full, cannot insert more items\n"
|
|
break
|
|
}
|
|
}
|
|
|
|
/* now print the messages extracted from the queue */
|
|
printf "\nContents of the queue:\n"
|
|
while (extract(msg))
|
|
printf "[%d] %s\n", msg[priority], msg[text]
|
|
}
|
|
|
|
const queuesize = 10
|
|
new queue[queuesize][message]
|
|
new queueitems = 0
|
|
|
|
insert(const item[message])
|
|
{
|
|
/* check if the queue can hold one more message */
|
|
if (queueitems == queuesize)
|
|
return false /* queue is full */
|
|
|
|
/* find the position to insert it to */
|
|
new pos = queueitems /* start at the bottom */
|
|
while (pos > 0 && item[priority] > queue[pos-1][priority])
|
|
--pos /* higher priority: move up a slot */
|
|
|
|
/* make place for the item at the insertion spot */
|
|
for (new i = queueitems; i > pos; --i)
|
|
queue[i] = queue[i-1]
|
|
|
|
/* add the message to the correct slot */
|
|
queue[pos] = item
|
|
queueitems++
|
|
|
|
return true
|
|
}
|
|
|
|
extract(item[message])
|
|
{
|
|
/* check whether the queue has one more message */
|
|
if (queueitems == 0)
|
|
return false /* queue is empty */
|
|
|
|
/* copy the topmost item */
|
|
item = queue[0]
|
|
--queueitems
|
|
|
|
/* move the queue one position up */
|
|
for (new i = 0; i < queueitems; ++i)
|
|
queue[i] = queue[i+1]
|
|
|
|
return true
|
|
}
|