我想推!通过将矢量大小加倍并将旧堆栈元素复制到其中来填充整个堆栈。但是,我的代码目前在无限循环中运行。我做错了什么?
(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)))
谢谢!
答案 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)))
....