June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
35
Task/Priority-queue/XLISP/priority-queue-1.xlisp
Normal file
35
Task/Priority-queue/XLISP/priority-queue-1.xlisp
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
(define-class priority-queue
|
||||
(instance-variables queue lowest-priority most-urgent) )
|
||||
|
||||
(define-method (priority-queue 'initialize limit)
|
||||
(defun setup (x)
|
||||
(vector-set! queue x nil)
|
||||
(if (< x limit)
|
||||
(setup (+ x 1)) ) )
|
||||
(setq lowest-priority limit)
|
||||
(setq most-urgent limit)
|
||||
(setq queue (make-vector (+ limit 1)))
|
||||
(setup 0)
|
||||
self )
|
||||
|
||||
(define-method (priority-queue 'push item priority)
|
||||
(if (and (integerp priority) (>= priority 0) (<= priority lowest-priority))
|
||||
(progn
|
||||
(setq most-urgent (min priority most-urgent))
|
||||
(vector-set! queue priority (nconc (vector-ref queue priority) (cons item nil))) ) ) )
|
||||
|
||||
(define-method (priority-queue 'pop)
|
||||
(defun find-next (q)
|
||||
(if (or (= q lowest-priority) (not (null (vector-ref queue q))))
|
||||
q
|
||||
(find-next (+ q 1)) ) )
|
||||
(define item (car (vector-ref queue most-urgent)))
|
||||
(vector-set! queue most-urgent (cdr (vector-ref queue most-urgent)))
|
||||
(setq most-urgent (find-next most-urgent))
|
||||
item )
|
||||
|
||||
(define-method (priority-queue 'peek)
|
||||
(car (vector-ref queue most-urgent)) )
|
||||
|
||||
(define-method (priority-queue 'emptyp)
|
||||
(and (= most-urgent lowest-priority) (null (vector-ref queue most-urgent))) )
|
||||
Loading…
Add table
Add a link
Reference in a new issue