我在球拍中实现堆栈有什么问题?

时间:2013-04-12 05:53:08

标签: functional-programming stack racket

我正在学习球拍和新功能编程,并为堆栈编写了以下代码:

(define stack '(0))

(define (push x stack)
  (set! stack (cons x stack)))

(define (pop stack)
  (let ((result (car stack)))
    (set! stack (cdr stack))
     result))

当我这样做时

(push 2 stack)

没有错误。 当我(pop stack)时,我回到0。 我做错了什么。

3 个答案:

答案 0 :(得分:1)

您有一个全局st变量,但您在set!push的本地变量上调用pop。您需要从函数中删除st参数。如果将st参数重命名为其他内容(如stack),问题可能会更明显。

(define (push x stack)
  (set! stack (cons x stack)))   ; stack is mutated, but st remains unchanged

答案 1 :(得分:0)

您正在使用全局状态即st并将st作为参数传递以推送,这会导致推送中的本地st更新并且全局{{1} }仍然是st

您可以通过删除全局'(0)来解决此问题,如下所示:

st

用法:

    (define (push x st)
      (cons x st))

    (define (pop st)
      (values (car st) (cdr st)))

答案 2 :(得分:-1)

这是我的版本/实现:

(define stack empty)

(define (push x)
  (set! stack (append stack (list x))))

(define (pop)
  (define reversedStack (reverse stack))
  (define result (car reversedStack))
    (set! stack (reverse (cdr reversedStack)))
     result)