我怎么能写一个计算器前缀符号,当它应该计算这个例子'(+ *3 2-2 1),其中没有括号之间的字符?当我有了括号,我可以处理它,但在这种情况下,我迷路了。
发布于 2013-04-24 00:30:00
在谷歌上快速搜索一下,就会出现this维基百科页面,其中包含一个使用堆栈进行前缀评估的实现(伪代码)。这是编写您自己的实现的起点。还要注意,使用Lisp的链表可以很容易地实现堆栈,只需在头部添加/删除元素即可。
发布于 2013-04-24 15:40:37
我是一个计划的初学者(如果这是令人讨厌的代码,请原谅)。这个是带括号的:
(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))
我想把这段代码修复成不带括号的代码,但条件和列出原始输入让我止步不前。我不知道如何写条件,这样我就不会丢失原始输入,也不会丢失最终的计算。
有我的条件(但我认为,有错误的语法
(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))感谢您的回答和提示:)
发布于 2013-05-01 10:33:48
(define (polish-notation-eval expr)
(if (finished? expr)
(car expr)
(polish-notation-eval (the-once-over expr)))) ;;要么我们完成了,要么我们需要进行-once-over-over,以便更接近完成。
(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))))));;只需向下滚动列表,查找要计算的格式良好的表达式。
(define *the-operations*
(list (list '+ +)
(list '* *)
(list '- -)
(list '/ /)));;具有名称和功能的关联列表
(define (get-operator name)
(cadr (assoc name *the-operations*)))(define (finished? expr)
(= (length expr) 1))(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?https://stackoverflow.com/questions/16174115
复制相似问题