中缀到前缀转换方案

时间:2014-10-27 19:26:44

标签: scheme prefix infix-notation

我试图弄清楚如何将中缀表达式转换为Scheme中的前缀。

我找到了this帖子,它做了我想做的事,但方向相反。从infix->前缀而不是prefix-> infix?

时会发生什么变化

编辑:我忘了提到我需要考虑和处理变量。例如输入

'(2 + 3 * a ^ 5 + b)

1 个答案:

答案 0 :(得分:1)

修改链接到的算法非常简单:

(define (infix->prefix lst)
  (cond
    ((list? lst) 
     (unless (= 3 (length lst)) (error "not 3 elements"))
     (let ((operand1 (car lst))
           (operator (cadr lst))
           (operand2 (caddr lst)))
       (list operator
             (infix->prefix operand1)
             (infix->prefix operand2))))
    (else lst)))

测试:

> (infix->prefix '(1 + 2))
'(+ 1 2)
> (infix->prefix '(1 + (2 * 3)))
'(+ 1 (* 2 3))
> (infix->prefix '((1 / 4) + (2 * 3)))
'(+ (/ 1 4) (* 2 3))

这不是一般算法;如果您需要更精细的内容,请展示您需要做的转换示例。

编辑以下是适用于较长表达式但不实现运算符优先级的示例代码:

(define (infix->prefix lst)
  (if (list? lst)
      (if (null? (cdr lst))
          ; list with one element -> return element
          (infix->prefix (car lst))
          ; list with more than one element
          (list (cadr lst)
                (infix->prefix (car lst))
                (infix->prefix (cddr lst))))
      ; not a list -> return element
      lst))

测试:

> (infix->prefix '(2 + 3 * a ^ 5 + b))
'(+ 2 (* 3 (^ a (+ 5 b))))