首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LIFO列表在计划中的实现

LIFO列表在计划中的实现
EN

Stack Overflow用户
提问于 2015-03-24 23:16:14
回答 1查看 3.1K关注 0票数 3

我在执行LIFO列表时遇到了一些困难。如果我只想将一个元素推到堆栈上,但我希望能够推送几个元素,那么我的代码就能工作得很好。这是我的代码:

代码语言:javascript
复制
(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中的列表中了!因此,当我将它发送到make-堆栈过程时,它作为嵌套列表出现。我试图创建一个递归过程来修复这个问题:

代码语言:javascript
复制
(define (push! lifo . args)
   (if (null? args)
        lifo
        (lifo 'push! (car args))
   (push! lifo (cdr args))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-24 23:33:38

也许:

代码语言:javascript
复制
(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)

输出:

代码语言:javascript
复制
'(d c b a)
'(c b a)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29244677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档