后缀到中缀对话

Postfix to Infix conversation

本文关键字:对话 中缀 后缀      更新时间:2023-10-16

>我无法从后缀到中缀解决这个表达式。请帮助我详细了解

5 x y - / x y + 3 ^ 7 / +

这不是代码,而是方式,您应该将后缀扩展到中缀:

5 x y

-/x y + 3 ^ 7/+

5 (x-y)/xy+ 3^ 7/+

5/(x-y)) xy+ 3^ 7/+

5/(x-y)) (x+y)3^ 7/+

5/(x-y)) ((x+y)^3) 7/+

5/(x-y)) (((x+y)^3)/7) +

5/(x-y)) + (((x+y)^3)/7)

这相当简单:

  1. 您读取参数并决定它是值还是变量。如果是,则在堆栈上推送参数。如果不是,则为操作员。
  2. 如果您有运算符,则可以创建一个树,该树由作为根的运算符和堆栈的参数与其子级一样多的参数组成。你把树推到堆栈上。
  3. 当您要打印中缀表示法时,您需要按顺序遍历堆栈顶部(原始的后修复表示法只是同一树的后序遍历)。

为了在C++中解决这个问题,我创建了一个基类(Expression),其派生类代表不同类型的节点(ValueVariableBinaryOperation)并维护一个std::stack<std::shared_ptr<Expression>>。编码出来主要是一个打字练习。

缀到中缀:

5 x y - / x y + 3 ^ 7 / +

5 x y -/
A) 5xy-/= 5 (x-y)/= (5/(x-y))
x y +
B) x y + = (x + y)
(x+y) 3 ^
B.1) (x + y) 3 ^ = ((x + y) ^ 3 )
现在, (5/(x-y)) ((x + y) ^ 3 ) 7/+
= (5/(x-y)) (((x + y) ^ 3 )/7 ) + = (5/(x-y)) + (((x + y) ^ 3 )/7 )

POSTFIX 和 PREFIX 是不使用括号的表达式。运算符的优先级是按照表达式中出现的顺序决定的,因此要计算表达式无需搜索下一个要执行的操作 - FAST

在 INFIX 表达式中,运算符的优先级被括号覆盖。 因此中缀表达式中有括号 - 需要搜索要执行的操作,例如 A+B%D - 因此很慢
这就是转换在计算机科学中有用的原因。