• 【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柯于旺 原创文章,如需转载请联系本人。

  • 相关阅读:
    团队博客(21)
    团队博客(20)
    站立会议报告(14)
    站立会议报告(13)
    软件工程(2018)第二次团队作业
    团队作业(一)
    结对第二次作业
    结对编程第一次作业
    软件工程第三次个人作业
    第二次作业软件工程
  • 原文地址:https://www.cnblogs.com/NoMasp/p/4786096.html
Copyright © 2020-2023  润新知