2013-05-12 124 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