;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Queue Operations ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Classes ;;; Queue class. (defclass () (elements :type :accessor elements :initvalue '())) ;;; These objects can be inserted to a priority queue. (defclass () (key :type :accessor key :initarg :key :initvalue 0)) ;;; Priority-queue is a queue that holds s. (defclass ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Interface ;;; Is the queue empty? (defgeneric (empty-queue? queue)) ;;; Reset the queue -- get rid of all the elements. (defgeneric (reset queue)) ;;; Put a value in. (defgeneric (enqueue element queue)) ;;; Get the top queue element without removing it. (defgeneric (queue-top queue)) ;;; Pull the next element out. (defgeneric (dequeue queue)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Implementation (defmethod (empty-queue? (q )) (null? (elements q))) (defmethod (reset (q )) (set! (elements q) empty)) ;;; Add an element - always at the end. (defmethod (enqueue x (q )) (let ((pair (list x))) (if (empty-queue? q) (set! (elements q) pair) (set! (tail (last-pair (elements q))) pair)))) ;;; Getting a value out always takes the first one. (defmethod (queue-top (q )) (if (empty-queue? q) (error 'dequeue "queue is empty.") (head (elements q)))) ;;; Getting a value out of a queue. (defmethod (dequeue (q )) (let ((obj (queue-top q))) (set! (elements q) (tail (elements q))) obj)) ;;; Forbid addition of non- things in s. (defmethod (enqueue x (q )) (error 'priority-queue "elements must be .")) ;;; Add an element with a priority to a . (defmethod (enqueue (x ) (q )) (let ((elts (elements q)) (xkey (key x))) ;; this adds x to a list by modifying the list (define (insert-x! lst) (if (or (null? (tail lst)) (< xkey (key (second lst)))) (set! (tail lst) (cons x (tail lst))) (insert-x! (tail lst)))) (if (or (null? elts) (< xkey (key (head elts)))) (set! (elements q) (cons x elts)) (insert-x! elts))))