首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp前缀计算器

Lisp前缀计算器
EN

Stack Overflow用户
提问于 2013-04-24 00:03:53
回答 3查看 1.6K关注 0票数 0

我怎么能写一个计算器前缀符号,当它应该计算这个例子'(+ *3 2-2 1),其中没有括号之间的字符?当我有了括号,我可以处理它,但在这种情况下,我迷路了。

EN

回答 3

Stack Overflow用户

发布于 2013-04-24 00:30:00

在谷歌上快速搜索一下,就会出现this维基百科页面,其中包含一个使用堆栈进行前缀评估的实现(伪代码)。这是编写您自己的实现的起点。还要注意,使用Lisp的链表可以很容易地实现堆栈,只需在头部添加/删除元素即可。

票数 3
EN

Stack Overflow用户

发布于 2013-04-24 15:40:37

我是一个计划的初学者(如果这是令人讨厌的代码,请原谅)。这个是带括号的:

代码语言:javascript
复制
(define (fce a)
  (case a
    (( + ) +)
    (( - ) -)
    (( * ) *)
    (( / ) /)))

(define (analyze vyraz)
  (if (list? vyraz)
      (calcul vyraz)
      vyraz))

(define (calcul vyraz)
  (if (= (length vyraz) 3 )
      ((fce (car vyraz)) (analyze (cadr vyraz)) (analyze (caddr vyraz)))
      (calcul (cons (calcul (list (car vyraz) (cadr vyraz) (caddr vyraz) (cadddr vyraz)))))))

下面的代码可以计算如下:(calcul '(- (* 3 2)(+ 1 2))

我想把这段代码修复成不带括号的代码,但条件和列出原始输入让我止步不前。我不知道如何写条件,这样我就不会丢失原始输入,也不会丢失最终的计算。

有我的条件(但我认为,有错误的语法

代码语言:javascript
复制
(define (count vyraz)
  (cond (list? vyraz)
        (number? (car vyraz) (cons (car vyraz)))
        (number? (cdr vyraz) (cons (cdr vyraz)))
        (symbol? (cddr vyraz) (cons (cddr vyraz)))
        (else (cdr vyraz) (count vyraz))) 
  (calcul vyraz))

感谢您的回答和提示:)

票数 0
EN

Stack Overflow用户

发布于 2013-05-01 10:33:48

代码语言:javascript
复制
(define (polish-notation-eval expr)
 (if (finished? expr) 
     (car expr)
     (polish-notation-eval (the-once-over expr)))) 

;;要么我们完成了,要么我们需要进行-once-over-over,以便更接近完成。

代码语言:javascript
复制
(define (the-once-over expr)
  (cond ((null? expr) expr )
    ((well-formed-expr? expr)
     (cons ((get-operator (car expr)) (cadr expr) (caddr expr))
           (the-once-over (cdddr expr))))
    (else (cons (car expr) (the-once-over (cdr expr))))))

;;只需向下滚动列表,查找要计算的格式良好的表达式。

代码语言:javascript
复制
(define *the-operations*
  (list (list '+ +)
    (list '* *)
    (list '- -)
    (list '/ /)))

;;具有名称和功能的关联列表

代码语言:javascript
复制
(define (get-operator name)
  (cadr (assoc name *the-operations*)))

代码语言:javascript
复制
(define (finished? expr) 
 (= (length expr) 1))

代码语言:javascript
复制
(define (well-formed-expr? expr)
 (and (assoc (car expr) *the-operations*) 
      (number? (cadr expr))
      (number? (caddr expr))))
 ;;are the next three elements something we can go ahead and evaluate?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16174115

复制
相关文章

相似问题

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