0

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

4

3 回答 3

3

在 google 上快速搜索产生了这个wikipedia 页面,其中包含使用堆栈的前缀评估的实现(以伪代码形式)。这是编写自己的实现的起点。另请注意,使用 Lisp 的链表可以轻松实现堆栈,只需在头部添加/删除元素。

于 2013-04-23T16:30:00.240 回答
0
(define (polish-notation-eval expr)
 (if (finished? expr) 
     (car expr)
     (polish-notation-eval (the-once-over expr)))) 

;;要么我们完成了,要么我们需要再做一遍以接近完成。

(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?
于 2013-05-01T02:33:48.263 回答
0

我是方案的初学者(如果是讨厌的代码,请原谅)。这个是带括号的:

(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-04-24T07:40:37.110 回答