さかもとのブログ

つらつらと

SICP演習問題3.21~3.23

  • 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]))