【SICP练习】109 练习3.22
练习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.
分析
这道题中的局部状态由指向一个常规表的开始和结束指针组成。并且要将insert-queue!和delete-queue!嵌套进整个过程中。通过dispatch来调用这些函数。
(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
补充
由于insert-queue!有参数,所以在dispatch中不需要添加括号,否则会报错。
感谢访问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。
为使本文得到斧正和提问,转载请注明出处:
http://blog.csdn.net/nomasp
版权声明:本文为 NoMasp柯于旺 原创文章,如需转载请联系本人。