计算机程序的构造和解释 练习题3.22

其实就是写成跟练习3.20相似的实现方式,比较简单,代码如下。

#lang R5RS
(define (make-queue) 
  (let ((front-ptr '())
        (rear-ptr '()))
        (define (set-f! v)(set! front-ptr v))
        (define (set-r! v)(set! rear-ptr v))
        (define (empty-queue?) (null? front-ptr))
        (define (front-queue) 
          (if (empty-queue?)
              (display "FRONT called with an empty queue")
              (car front-ptr)))
        (define (insert-queue! item) 
          (let ((new-pair (cons item '())))
            (cond ((empty-queue?)
                   (set-f! new-pair)
                   (set-r! new-pair))
                  (else
                   (set-cdr! rear-ptr new-pair)
                   (set-r! new-pair)))))
        (define (delete-queue!)
          (cond ((empty-queue?)
                 (display "DELETE! called with an empty queue"))
                (else
                 (set-f! (cdr front-ptr))
                 )))
        (define (print-queue)
          (display front-ptr)
          (newline))
        (define (dispatch m)
          (cond ((eq? m 'empty-queue?) (empty-queue?))
                ((eq? m 'front-queue) front-queue)
                ((eq? m 'insert-queue!) insert-queue!)
                ((eq? m 'delete-queue!) (delete-queue!))
                ((eq? m 'print-queue) (print-queue))
                (else (display "ERROR"))))
        dispatch) 
  )
(define (empty-queue? queue) (queue 'empty-queue?))
(define (front-queue queue) (queue 'front-queue))
(define (insert-queue! queue item) ((queue 'insert-queue!) item))
(define (delete-queue! queue) (queue 'delete-queue!))
(define (print-queue queue) (queue 'print-queue))
  
(define q1 (make-queue))
(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)

运行结果

(a)
(a b)
(b)
()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值