github.com
(define (make-queue) (cons '() '()))
(define (front-ptr queue) (car queue))
(define (rear-ptr queue) (cdr queue))
(define (set-front-ptr! queue item) (set-car! queue item))
(define (set-rear-ptr! queue item) (set-cdr! queue item))
(define (empty-queue? queue) (null? (front-ptr queue)))
(define (front-queue queue)
(if (empty-queue? queue)
(error "FRONT called with an empty queue" queue)
(car (front-ptr queue))))
(define (insert-queue! queue item)
(let ((new-pair (cons item '())))
(cond ((empty-queue? queue)
(set-front-ptr! queue new-pair)
(set-rear-ptr! queue new-pair)
queue)
(else
(set-cdr! (rear-ptr queue) new-pair)
(set-rear-ptr! queue new-pair)
queue))))
(define (delete-queue! queue)
(cond ((empty-queue? queue)
(error "DELETE! called with an empty queue" queue))
(else
(set-front-ptr! queue (cdr (front-ptr queue)))
queue)))
(define (print-queue queue)
(print (car queue)))
(define q1 (make-queue))
(print "************************** ex-3.21")
(print-queue q1)
(insert-queue! q1 'a)
(print-queue q1)
(insert-queue! q1 'b)
(print-queue q1)
(delete-queue! q1)
(print-queue q1)
(delete-queue! q1)
(print-queue q1)
(define (make-queue-dispatch)
(let ((front-ptr '())
(rear-ptr '()))
(define (set-front-ptr! item) (set! front-ptr item))
(define (set-rear-ptr! item) (set! rear-ptr item))
(define (empty-queue?) (null? front-ptr))
(define (front-queue)
(if (empty-queue?)
(error "FRONT called with an empty queue" front-ptr)
(car front-ptr)))
(define (rear-queue)
(if (empty-queue?)
(error "FRONT called with an empty queue" rear-ptr)
(car rear-ptr)))
(define (insert-queue! item)
(let ((new-pair (cons item '())))
(cond ((empty-queue?)
(set-front-ptr! new-pair)
(set-rear-ptr! new-pair)
front-ptr)
(else
(set-cdr! rear-ptr new-pair)
(set-rear-ptr! new-pair)
front-ptr))))
(define (delete-queue!)
(cond ((empty-queue?)
(error "DELETE! called with an empty queue" front-ptr))
(else
(set-front-ptr! (cdr front-ptr))
front-ptr)))
(define (print-queue)
(print front-ptr))
(define (dispatch m)
(cond ((eq? m 'insert-queue!) insert-queue!)
((eq? m 'delete-queue!) delete-queue!)
((eq? m 'front) front-queue)
((eq? m 'rear) rear-queue)
((eq? m 'print-queue) (print-queue))
(else
(error "Undefined operation -- MAKE-QUEUE" m))))
dispatch))
(define q (make-queue-dispatch))
(print "************************** ex-3.22")
((q 'insert-queue!) 'a)
(q 'print-queue)
((q 'insert-queue!) 'b)
(q 'print-queue)
((q 'insert-queue!) 'c)
(q 'print-queue)
((q 'delete-queue!))
(q 'print-queue)
((q 'delete-queue!))
(q 'print-queue)
((q 'insert-queue!) 'd)
(q 'print-queue)
((q 'delete-queue!))
(q 'print-queue)
((q 'delete-queue!))
(q 'print-queue)
(define (value-ptr ptr) (caar ptr))
(define (prev-ptr ptr) (cdar ptr))
(define (next-ptr ptr) (cdr ptr))
(define (print-deque queue)
(let recur ((deque (front-ptr queue)))
(cond ((null? deque) '())
(else
(cons (value-ptr deque)
(recur (next-ptr deque)))))))
(define (make-deque) (cons '() '()))
(define (deque-front-ptr deque) (car deque))
(define (deque-rear-ptr deque) (cdr deque))
(define (empty-deque? deque) (null? (deque-front-ptr deque)))
(define (front-deque deque)
(if (empty-deque? deque)
(error "FRONT called with an empty deque" deque)
(car (deque-front-ptr deque))))
(define (rear-deque deque)
(if (empty-deque? deque)
(error "REAR called with an empty deque" deque)
(car (deque-rear-ptr deque))))
(define (front-insert-deque! deque item)
(let ((new-pair (list (list item))))
(cond ((empty-deque? deque)
(set-front-ptr! deque new-pair)
(set-rear-ptr! deque new-pair)
deque)
(else
(let ((before-front-item (car (front-ptr deque))))
(set-cdr! new-pair (front-ptr deque))
(set-front-ptr! deque new-pair)
(set-cdr! before-front-item (front-ptr deque)))
deque))))
(define (rear-insert-deque! deque item)
(let ((new-pair (list (list item))))
(cond ((empty-deque? deque)
(set-front-ptr! deque new-pair)
(set-rear-ptr! deque new-pair)
deque)
(else
(set-cdr! (car new-pair) (rear-ptr deque))
(set-cdr! (cdr deque) new-pair)
(set-rear-ptr! deque new-pair)
deque))))
(define (front-delete-deque! deque)
(cond ((empty-deque? deque)
(error "DELETE! called with an empty deque" deque))
(else
(set-front-ptr! deque (cdr (car deque)))
(set-cdr! (car (front-ptr deque)) '())
deque)))
(define (rear-delete-deque! deque)
(cond ((empty-deque? deque)
(error "DELETE! called with an empty deque" deque))
(else
(set-rear-ptr! deque (cdr (car (rear-ptr deque))))
(set-cdr! (rear-ptr deque) '())
deque)))
(print "************************** ex-3.23")
(define dq (make-deque))
(print "insert-queue!")
(front-insert-deque! dq 'a)
(print (print-deque dq))
(front-insert-deque! dq 'b)
(print (print-deque dq))
(front-insert-deque! dq 'c)
(print (print-deque dq))
(print "rear-insert-deque!")
(rear-insert-deque! dq 'd)
(print (print-deque dq))
(rear-insert-deque! dq 'e)
(print (print-deque dq))
(print "front-delete-deque!")
(front-delete-deque! dq)
(print (print-deque dq))
(front-delete-deque! dq)
(print (print-deque dq))
(print "rear-delete-deque!")
(rear-delete-deque! dq)
(print (print-deque dq))
(rear-delete-deque! dq)
(print (print-deque dq))