【问题标题】:Infix to Prefix conversion scheme中缀到前缀转换方案
【发布时间】:2014-10-27 19:26:44
【问题描述】:

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

我发现this 的帖子做了我想要的,但方向相反。从 infix->prefix 而不是 prefix->infix 会有什么变化?

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

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

【问题讨论】:

    标签: scheme prefix infix-notation


    【解决方案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))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 2011-05-21
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多