- 3.21
;;;exercise3.21 (define (print-queue queue) (map append (front-ptr queue)))
- 3.22
;;exercise3.22 (define (make-queue) (let ((front-ptr '()) (rear-ptr '())) (define (set-front-ptr! item) (set! front-ptr item)) (define (set-reat-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" (cons front-ptr rear-ptr)) (car front-ptr))) (define (insert-queue! item) (let ((new-pair (cons item '()))) (cond [(empty-queue?) (set-front-ptr! new-pair) (set-reat-ptr! new-pair) (cons front-ptr rear-ptr)] [else (set-cdr! (rear-ptr) new-pair) (set-reat-ptr! new-pair) (cons front-ptr rear-ptr)]))) (define (delete-queue! item) (if (empty-queue?) (error "DELETE with an empty-queue" (cons front-ptr rear-ptr)))) (define (dispatch m) (cond [(eq? m 'set-reat-ptr!) set-reat-ptr!] [(eq? m 'set-front-ptr!) set-front-ptr!] [(eq? m 'empty-queue?) empty-queue?] [(eq? m 'front-queue) front-queue] [(eq? m 'insert-queue!) insert-queue!] [(eq? m 'delete-queue!) delete-queue!])) dispatch))
ちょっと長いけど載せます.
双方向リストで実現.print-queueがないので,queueを評価しても汚いままなのがちょっといや.
なんとかできた、と思う
- 3.23
;;exercise3.23 ;make-queue, empty-queue?, front-queueなどは同じものを使う ;双方向リストを作る (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 (make-queue) (cons '() '())) (define (front-queue queue) (if (empty-queue? queue) (error "FRONT called with an empty queue" queue) (car (front-ptr queue)))) (define (rear-queue queue) (if (empty-queue? queue) (error "REAR called with an empty queue" queue) (car (rear-ptr queue)))) (define (rear-insert-queue! queue item) (let ((new-pair (list item '() '()))) (cond [(empty-queue? queue) (set-front-ptr! queue new-pair) (set-rear-ptr! queue new-pair) queue] [else (set! (cadr new-pair) (rear-ptr queue)) (set! (cddr (rear-ptr queue)) new-pair) (set-rear-ptr! queue new-pair) queue]))) (define (front-insert-queue! queue item) (let ((new-pair (list item '() '()))) (cond [(empty-queue? queue) (set-front-ptr! queue new-pair) (set-rear-ptr! queue new-pair) queue] [else (set! (cadr (front-ptr queue)) new-pair) (set! (cddr new-pair) (front-ptr queue)) (set-front-ptr! queue new-pair) queue]))) (define (rear-delete-queue! queue) (cond [(empty-queue? queue) (error "REAR DELETE with an empty queue" queue)] [else (set-rear-ptr! queue (cadr (rear-ptr queue))) (set! (cddr (rear-ptr queue)) '()) queue])) (define (front-delete-queue! queue) (cond [(empty-queue? queue) (error "FRONT DELETE with an empty queue" queue)] [else (set-front-ptr! queue (cddr (front-ptr queue))) queue]))