zoukankan      html  css  js  c++  java
  • SICP_3.21-3.22

      1 (define (front-ptr queue) (car queue))
      2 (define (rear-ptr queue) (cdr queue))
      3 
      4 (define (set-front-ptr! queue item) (set-car! queue item))
      5 (define (set-rear-ptr! queue item) (set-cdr! queue item))
      6 
      7 (define (empty-queue? queue) (null? (front-ptr queue)))
      8 
      9 (define (make-queue) (cons '() '()))
     10 
     11 (define (front-queue queue)
     12   (if (empty-queue? queue)
     13       (error "FRONT called with an empty queue" queue)
     14       (car (front-ptr queue))))
     15 
     16 (define (insert-queue! queue item)
     17   (let ((new-pair (cons item '())))
     18     (cond ((empty-queue? queue)
     19            (set-front-ptr! queue new-pair)
     20            (set-rear-ptr! queue new-pair)
     21            queue)
     22           (else (set-cdr! (rear-ptr queue) new-pair)
     23                 (set-rear-ptr! queue new-pair)
     24                 queue))))
     25 
     26 (define (delete-queue! queue)
     27   (if (empty-queue? queue)
     28       (error "DELETE called with an empty queue" queue)
     29       (begin
     30         (set-front-ptr! queue (cdr (front-ptr queue)))
     31         queue)))
     32 
     33 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     34 
     35 (define q1 (make-queue))
     36 
     37 (insert-queue! q1 'q)
     38 (insert-queue! q1 'b)
     39 (insert-queue! q1 'c)
     40 (delete-queue! q1)
     41 
     42 ;;;;;;;;;;;;;;;;3.21
     43 
     44 (define (print-queue queue)
     45   (car queue))
     46 
     47 (print-queue q1)
     48 (rear-ptr q1)
     49 (front-ptr q1)
     50 (set-cdr! (rear-ptr q1) '(m))
     51 ;(set-cdr! q1 '(m))
     52 
     53 (set-rear-ptr! q1 '(m))
     54 q1
     55 
     56 ;;;;;;;;;;;;;;;;3.22
     57 (define (make-queue2)
     58   (let ((front-ptr '())
     59         (rear-ptr '()))
     60     (define (set-front-ptr! item)
     61       (set! front-ptr item))
     62     (define (set-rear-ptr! item)
     63       (set! rear-ptr item))
     64     (define (empty-queue?)
     65       (null? front-ptr))
     66     (define (insert-queue! item)
     67       (let ((new-pair (list item)))
     68         (cond ((empty-queue?)
     69                (set-front-ptr! new-pair)
     70                (set-rear-ptr! new-pair)
     71                front-ptr)
     72               (else
     73                (set-cdr! rear-ptr new-pair)
     74                (set-rear-ptr! new-pair)
     75                front-ptr))))
     76     (define (delete-queue!)
     77             (cond ((empty-queue?)
     78                     (error "DELETE! called with an empty queue" front-ptr))
     79                   (else
     80                     (set-front-ptr! (cdr front-ptr))
     81                     front-ptr)))
     82     (define (dispatch m)
     83       (cond ((eq? m 'insert-queue!) insert-queue!)
     84             ((eq? m 'delete-queue!) delete-queue!)
     85             ((eq? m 'empty-queue?) empty-queue?)
     86             (else (error "Undefined operation" m))))
     87     dispatch))
     88 
     89 (define (make-queue3)
     90     (let ((front-ptr '())
     91           (rear-ptr '()))
     92         (define (insert-queue! item)
     93             (cond ((empty-queue?)
     94                     (let ((init-list (list item)))
     95                         (set! front-ptr init-list)
     96                         (set! rear-ptr init-list)
     97                         front-ptr))
     98                   (else
     99                     (let ((new-item (list item)))
    100                         (set-cdr! rear-ptr new-item)
    101                         (set! rear-ptr new-item)
    102                         front-ptr))))
    103         (define (delete-queue!)
    104             (cond ((empty-queue?)
    105                     (error "DELETE! called with an empty queue" front-ptr))
    106                   (else
    107                     (set! front-ptr (cdr front-ptr))
    108                     front-ptr)))
    109         (define (empty-queue?)
    110             (null? front-ptr))
    111         (define (dispatch m)
    112             (cond ((eq? m 'insert-queue!)
    113                     insert-queue!)
    114                   ((eq? m 'delete-queue!)
    115                     (delete-queue!))
    116                   ((eq? m 'empty-queue?)
    117                     (empty-queue?))
    118                   (else
    119                     (error "Unknow operation -- DISPATCH" m))))
    120         dispatch))
    121 
    122 ;(define q2 (make-queue3))
    123 ;((q2 'insert-queue!) 3)
    124 ;((q2 'insert-queue!) 4)
    125 
    126 ;(define q2 '(1))
    127 ;(set-cdr! q2 (list 2))
    128 ;q2

    这几题的理解花了几天,发现自己是想多了点,然后还有一个原因是理解错误

    126-128 的结果为(1 2)不是 (1 (2))

    Yosoro
  • 相关阅读:
    [BinaryTree] AVL树、红黑树、B/B+树和Trie树的比较
    [C/C++] 堆和栈的区别
    HBuilde H5开发,关于JSON的Storage存储
    你是怎么调试 JavaScript 程序
    plus.webview.create mui.openWindow区别是什么呢
    H5本地存储详细使用教程(localStorage + JSON数据存储应用框架)
    [工具教程] HBuilder调试夜神安卓模拟器方法(该方法真实有效)
    HBuilder使用夜神模拟器调试Android应用
    Android如何使用API
    Linux下安装方法总结(源码安装)
  • 原文地址:https://www.cnblogs.com/tclan126/p/6624561.html
Copyright © 2011-2022 走看看