;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 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)) ;;; 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))) ;;; Add an element - always at the end. (defmethod (enqueue x (q )) (let ((pair (list x))) (if (null? (elements 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 'queue-top "queue is empty.") (head (elements q)))) ;;; Getting a value out of a queue. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Problem 3 is to write this missing generic function dequeue. ;;; ;;; Make sure to adhere to the interface above. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; 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))))