2013-05-12 120 views
-1

我仍在学习Lisp语言,我需要了解如何使用Lisp实现堆栈(需要push-pop-peek函数。)。另外,当我寻求帮助时,我发现了这个代码。但我不确定它是否正常工作。如何以LISP语言实现堆栈

(defstruct stack 
    elements) 

(defun stack-push (element stack) 
    (push element (stack-elements stack))) 

(defun stack-pop (stack)(deftype Stack [elements]) 

(defun stack-empty (stack) 
    (endp (stack-elements stack))) 

(defun stack-top (stack) 
    (first (stack-elements stack))) 

(defun stack-peek (stack) 
    (stack-top stack)) 
+0

此代码看起来很简单,虽然没有实现“stack-pop”。 (我假设'(deftype Stack [elements])'应该是一个单独的表单,尽管我不确定它应该做什么。)但是代码或多或少都可以。你为什么不确定它是否正常工作?你试过了吗?测试过了吗?你会得到意想不到的结果? – 2013-05-12 01:10:46

+0

我真正的问题是,当我在Sbcl中运行此代码时,我只能看到STACK和STACK-PUSH.I无法看到POP和PEEK。如何解决此问题? – 2013-05-12 07:37:58

回答

2

Lisp列表实际上是功能堆栈本身。

(缺点)将a推入堆栈l。

(车l)返回第一个元素(偷看)。

(cdr l)只返回第一个元素(一个pop)。

+0

是的,但是这个代码中的实际实现在哪里,这是我真的不明白..? – 2013-05-12 01:07:22

+0

在这种情况下,没有单独的实现。问题在于Lisp中堆栈已经存在,cons与push相同,car与peek相同,cdr与pop相同。 – Greg 2013-05-12 01:10:01

+1

@VolkanÖztüzün值得注意的是,在“Lisp列表实际上是_functional_栈本身”中,“功能_”这个词被用作功能编程的意义。与其将'push'和'pop'视为某些具有可变状态的对象的方法,不如将它们视为返回新旧堆栈的函数,而是分别添加一个或少一个元素。例如,'stack1 =(1 2 3)','stack2 =(push 0 stack1)=(0 1 2 3)'和'stack1!= stack2'。 – 2013-05-12 02:11:33