加倍堆栈的大小

时间:2013-11-14 05:05:30

标签: scheme push

我想推!通过将矢量大小加倍并将旧堆栈元素复制到其中来填充整个堆栈。但是,我的代码目前在无限循环中运行。我做错了什么?

(define push!
    (lambda (ra-stack item)
      (if (<= (vector-length (cells ra-stack))
              (height ra-stack))
          (begin (display "Enlarging stack...")
                 (enlarge-stack! ra-stack)
                 (push! ra-stack item))
          (begin (vector-set! (cells ra-stack) (height ra-stack) item) 
                 (set-height! ra-stack (+ (height ra-stack) 1)) ra-stack))))

  (define enlarge-stack!
    (lambda (ra-stack)
      (let ((cells-length (vector-length (cells ra-stack))))
        (make-vector (* 2 cells-length)))))

以下所有代码都能正常运作。

(define set-height! 
    (lambda (ra-stack new-height)
      (vector-set! ra-stack 0 new-height)))

(define cells  
    (lambda (ra-stack)
      (vector-ref ra-stack 1)))

(define height
    (lambda (ra-stack)
      (vector-ref ra-stack 0)))

(define set-cells!  
    (lambda (ra-stack new-cells)
      (vector-set! ra-stack 1 new-cells)))

谢谢!

1 个答案:

答案 0 :(得分:1)

您的enlarge-stack!不会以任何方式影响其论点。它没有set-cells!它的细胞到新的放大矢量;它也不会尝试将元素从旧向量复制到新向量。

您目前所拥有的内容更恰当地称为enlarged-stack-cells。即它返回新的,放大的,空的向量,准备接收旧值的副本。

(define enlarged-stack-cells
    (lambda (ra-stack)
      (let ((cells-length (vector-length (cells ra-stack))))
        (make-vector (* 2 cells-length)))))     ; returns the new vector

(define enlarge-stack!
    (lambda (ra-stack)
      (let ((cs (enlarged-stack-cells ra-stack)))
        (begin
          (copy-cells! cs (cells ra-stack))     ; write it
          (set-cells! ra-stack cs)))))

写下来:

(define copy-cells!
    (lambda (newcells oldcells)
      (let ((cells-length (vector-length oldcells)))
         ....