中缀到前缀转换方案
Posted
技术标签:
【中文标题】中缀到前缀转换方案【英文标题】:Infix to Prefix conversion scheme 【发布时间】:2014-10-27 19:26:44 【问题描述】:我试图弄清楚如何将中缀表达式转换为 Scheme 中的前缀。
我发现this 的帖子做了我想要的,但方向相反。从 infix->prefix 而不是 prefix->infix 会有什么变化?
编辑:我忘了提到我需要考虑和处理变量。例如输入
'(2 + 3 * a ^ 5 + b)
【问题讨论】:
【参考方案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))))
【讨论】:
是的,这就是我需要的,但我忘了在描述中添加我还需要考虑可能的变量。例如,我将如何解析字符串 '(2 + 3 * a ^ 5 + b)。 变量没有问题,例如(infix->prefix '(2 + (3 * a)))
将产生'(+ 2 (* 3 a))
。但没有考虑的是 1) 超过 3 个元素的表达式,以及 2) 运算符的优先级。所以请添加一些有用的例子(输入和输出)。
恕我直言,上述程序无法处理“(infix->prefix '(1 + (2 + 3)))”这样的表达式,它会产生“(+ 1 (2 + 3))”。但是我们可以做一个小的调整: (if (null? (cdr lst)) ; list with one element -> return element (car lst) ======> (if (null? (cdr lst)) ; list带有一个元素 -> 返回元素(中缀前缀(car lst))以上是关于中缀到前缀转换方案的主要内容,如果未能解决你的问题,请参考以下文章