我试图弄清楚如何将中缀表达式转换为Scheme中的前缀。
我找到了this帖子,它做了我想做的事,但方向相反。从infix->前缀而不是prefix-> infix?
时会发生什么变化编辑:我忘了提到我需要考虑和处理变量。例如输入
'(2 + 3 * a ^ 5 + b)
答案 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))))