+关注继续查看

# 练习3-22

## 原文

Exercise 3.22. Instead of representing a queue as a pair of pointers, we can build a queue as a procedure with local state. The local state will consist of pointers to the beginning and the end of an ordinary list.
Thus, the make-queue procedure will have the form

 (define (make-queue)
(let ((front-ptr ...)
(rear-ptr ...))
<definitions of internal procedures>
(define (dispatch m) ...)
dispatch))

Complete the definition of make-queue and provide implementations of the queue operations using this representation.

## 分析

(define (make-queue)
(let ((front-ptr '())
(rear-ptr '()))

(define (empty-queue?)
(null? front-ptr))

(define (insert-queue! item)
(cond ((empty-queue?)
(let ((init-list (list item)))
(set! front-ptr init-list)
(set! rear-ptr init-list)
front-ptr))
(else
(let ((new-item (list item)))
(set-cdr! rear-ptr new-item)
(set! rear-ptr new-item)
front-ptr))))
(define (delete-queue!)
(cond ((empty-queue?)
(error "DELETE! called with an empty queue" queue))
(else
(set! front-ptr (cdr front-ptr))
front-ptr)))

(define (dispatch m)
(cond ((eq? m 'insert-queue!)
insert-queue!)
((eq? m 'delete-queue!)
(delete-queue!))
((eq? m 'empty-queue?)
(empty-queue?))
(else
(error "Unknown operation -- DISPATCH" m))))
dispatch))

## 测试


(define q3 (make-queue))

;Value: q3

((q3 'insert-queue!) 'a)

;Value 15: (a)

((q3 'insert-queue!) 'b)

;Value 16: (a b)

(q3 'delete-queue!)

;Value 17: (b)

(q3 'delete-queue!)

;Value: ()

(q3 'empty-queue?)

;Value: #t

## 补充

http://blog.csdn.net/nomasp

10099 0

12078 0

13897 0
windows server 2008阿里云ECS服务器安全设置

9161 0

4670 0

4511 0
+关注
542

0

《2021云上架构与运维峰会演讲合集》

《零基础CSS入门教程》

《零基础HTML入门教程》