方案中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"过程根本不起作用,我只是在最后一行得到了一个错误(也许我的递归是错误的)。正如我所说,这是我最后一次尝试,我就是搞不懂

编辑:

我现在已经尝试实现推送!,流行音乐以及将堆栈对象作为自变量的独立过程进行堆栈。流行音乐然后推!很容易,但在推动!我想添加的元素已经嵌套在推送中的列表中了!所以当我把它发送到makestack过程时,它会以嵌套列表的形式出现。我试图做一个递归程序来修复这个问题:

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

这只是一个循环,我不明白为什么。。。(递归对我来说是个大问题)

也许:

(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)

相关内容

  • 没有找到相关文章

最新更新