在计划中实施LIFO清单

时间:2015-03-24 23:16:14

标签: list stack scheme r5rs lifo

我在Scheme中实现LIFO列表时遇到了一些麻烦。如果我只想将一个元素推入堆栈,我的代码工作得很好,但我希望能够推送几个元素。这是我的代码:

(define (make-stack)
(let ((stack '()))
    (lambda (msg . args)
      (cond ((eq? msg 'pop!)
             (set! stack (cdr stack)))
            ((eq? msg 'push!) 
             (if (= 1 (length args))
                 (set! stack (cons args stack))
                 (push stack args)))
            ((eq? msg 'stack) stack)
            (else "Not valid message!")))))
(define (push stack args)
  (if (null? args)
      stack
      (set! stack (cons (car args) stack)))
  (push stack (cdr args)))

这只是我的最后一次尝试,我尝试了很多方法,我无法计算。我只是无法理解如何从'args'中获取元素并将它们逐个添加到堆栈中。 'push'程序根本不起作用,我只是在最后一行得到一个错误(也许我的递归是错误的)。正如我所说,这是我许多人的最后一次尝试,我只是无法理解它。

编辑:

我现在尝试实现push!,pop!并将堆栈作为独立的过程,将堆栈对象作为参数。啪!推!很容易,但推!我要添加的元素已经嵌套在推送列表中!所以当我将它发送到make-stack程序时,它作为嵌套列表进入。我试图做一个递归程序来解决这个问题:

(define (push! lifo . args)
   (if (null? args)
        lifo
        (lifo 'push! (car args))
   (push! lifo (cdr args))

这只是循环,我看不出为什么......(递归对我来说是个大问题)

1 个答案:

答案 0 :(得分:4)

也许:

(define (make-stack)
  (let ((stack '()))
    (lambda (msg . args)
      (cond 
        [(eq? msg 'pop!)  (set! stack (cdr stack))]
        [(eq? msg 'push!) (set! stack (append (reverse args) stack))]
        [(eq? msg 'stack) stack]
        [else "Not valid message!"]))))

(define s (make-stack))
(s 'push! 'a)
(s 'push! 'b 'c 'd)
(s 'stack)
(s 'pop!)
(s 'stack)

输出:

'(d c b a)
'(c b a)