Postfix to Infix对话

我无法解决从postfix到中缀的这个表达式。 请帮我详细了解一下

5 xy - / xy + 3 ^ 7 / + 

后缀为中缀:

 5 xy - / xy + 3 ^ 7 / + 

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

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

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

这不是代码而是方式,你应该将后缀扩展为infix ::

5 xy – / xy + 3 ^ 7 / +

5(xy)/ xy + 3 ^ 7 / +

(5 /(xy))xy + 3 ^ 7 / +

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

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

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

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

这是相当直接的:

  1. 您读取参数并确定它是值还是变量。 如果是,则将参数推入堆栈。 如果不是,那就是运营商。
  2. 如果您有一个运算符,则创建一个树,该树由作为根的运算符和作为其子项的堆栈的许多参数组成。 你将树推到堆栈上。
  3. 当您想要打印中缀表示法时,您可以执行堆栈顶部的有序遍历(原始的修复后表示法只是同一树的后序步行)。

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