中缀到前缀转换方案

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))

以上是关于中缀到前缀转换方案的主要内容,如果未能解决你的问题,请参考以下文章

逻辑条件的 C++ 中缀到前缀转换

中缀前缀后缀表达式的转换

如何在程序中将中缀表达式转换为后缀表达式

算术表达式的前缀,中缀,后缀相互转换

使用堆栈(LinkedList)将中缀转换为前缀

为啥我们在从中缀转换为前缀时必须反转字符串