SICPゼミ第18回
練習問題3.21
(define (print-queue queue) (display (car queue)))
Benはqueueの末尾のポインタを見てはっちゃけてるだけ。
by pine
練習問題3.22
(define (make-queue) (let ( (front-ptr '()) (rear-ptr '()) ) (define (empty-queue?) (null? front-ptr)) (define (insert-queue item) (let ((paired (cons item '()))) (if (empty-queue?) (begin (set! front-ptr paired) (set! rear-ptr paired)) (begin (set-cdr! rear-ptr paired) (set! rear-ptr paired)) ) ) ) (define (delete-queue) (if (empty-queue?) (error "なにもない") (set! front-ptr (cdr front-ptr)) ) ) (define (front-queue) (if (empty-queue?) (error "なにもない") (car front-ptr) ) ) (define (dispatch m) (cond ((eq? m 'insert) insert-queue) ((eq? m 'delete) (delete-queue)) ((eq? m 'front) (front-queue)) ((eq? m 'empty?) (empty-queue?)) (else (error "そんな手続きはない")) ) ) dispatch ) )
by dolicas
練習問題3.23
(define (front-ptr-deque queue) (car queue )) (define (rear-ptr-deque queue) (cdr queue )) (define (set-front-ptr-deque! queue item) (set-car! queue item)) (define (set-rear-ptr-deque! queue item) (set-cdr! queue item )) (define (empty-deque? queue) (null? (front-ptr-deque queue))) (define (make-deque) (cons '() '())) (define (front-deque queue) (if (empty-deque? queue) (error "FRONT called with an empty queue" queue) (caar (front-ptr-deque queue)))) (define (rear-deque queue) (if (empty-deque? queue) (error "FRONT called with an empty queue" queue) (caar (rear-ptr-deque queue)))) (define (front-insert-deque! queue item) (let ((new-pair (cons (cons item '()) (front-ptr-deque queue)))) (cond ((empty-deque? queue) (set-front-ptr-deque! queue new-pair) (set-rear-ptr-deque! queue new-pair) queue) (else (set-cdr! (car (front-ptr-deque queue)) new-pair) (set-front-ptr-deque! queue new-pair) queue )))) (define (rear-insert-deque! queue item) (let ((new-pair (cons (cons item (rear-ptr-deque queue)) '()))) (cond ((empty-deque? queue) (set-front-ptr-deque! queue new-pair) (set-rear-ptr-deque! queue new-pair) queue) (else (set-cdr! (rear-ptr-deque queue) new-pair) (set-rear-ptr-deque! queue new-pair) queue )))) (define (front-delete-deque! queue) (cond ((empty-deque? queue) (error "DELETE! called with an empty queue" queue )) (else (set-front-ptr-deque! queue (cdr (front-ptr-deque queue ))) queue ))) (define (rear-delete-deque! queue) (cond ((empty-deque? queue) (error "DELETE! called with an empty queue" queue )) (else (set-rear-ptr-deque! queue (cdar (rear-ptr-deque queue))) queue ))) (define (print-deque deq) (define (print-iter item) (if (eq? item (rear-ptr-deque deq)) (begin (display (caar item)) (newline) ) (begin (display (caar item)) (display " ") (print-iter (cdr item)) ) ) ) (print-iter (car deq)) )
(define (make-deque) (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-deque?) (null? front-ptr)) (define (front-deque) (if (empty-deque?) (error "FRONT called with an empty queue") front-ptr)) (define (rear-deque) (if (empty-deque?) (error "REAR called with an empty queue") rear-ptr)) (define (front-insert-deque! item) (let ((new-pair (cons (cons item nil) nil))) (if (empty-deque?) (begin (set-front-ptr! new-pair) (set-rear-ptr! new-pair)) (begin (set-cdr! (car front-ptr) new-pair) (set-cdr! new-pair front-ptr) (set-front-ptr! new-pair) (print-deque))))) (define (front-delete-deque!) (if (empty-deque?) (error "Delete called with an empty queue") (begin (if (eq? front-ptr rear-ptr) (begin (set! front-ptr nil) (set! rear-ptr nil)) (begin (set-front-ptr! (cdr front-ptr)) (set-cdr! (car front-ptr) nil))) (print-deque)))) (define (rear-insert-deque! item) (let ((new-pair (cons (cons item nil) nil))) (if (empty-deque?) (begin (set-front-ptr! new-pair) (set-rear-ptr! new-pair)) (begin (set-cdr! (car new-pair) rear-ptr) (set-cdr! rear-ptr new-pair) (set-rear-ptr! new-pair) (print-deque))))) (define (rear-delete-deque!) (if (empty-deque?) (error "Delete called with an empty queue") (begin (if (eq? front-ptr rear-ptr) (begin (set! front-ptr nil) (set! rear-ptr nil)) (begin (set-rear-ptr! (cdr (car rear-ptr))) (set-cdr! rear-ptr nil))) (print-deque)))) (define (print-deque) (define (print-deque-iter deque) (if (null? deque) nil (cons (caar deque) (print-deque-iter (cdr deque))))) (print-deque-iter front-ptr)) (define (dispatch m) (cond ((eq? m 'set-front-ptr!) set-front-ptr!) ((eq? m 'set-rear-ptr!) set-rear-ptr!) ((eq? m 'empty-deque?) (empty-deque?)) ((eq? m 'front-deque) (front-deque)) ((eq? m 'rear-deque) (rear-deque)) ((eq? m 'print-deque) (print-deque)) ((eq? m 'front-insert-deque!) front-insert-deque!) ((eq? m 'front-delete-deque!) (front-delete-deque!)) ((eq? m 'rear-insert-deque!) rear-insert-deque!) ((eq? m 'rear-delete-deque!) (rear-delete-deque!)))) dispatch))
dispatch使ってついでにdeleteのコーナーケースに対応した版
by pine