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)
这是相当直接的:
- 您读取参数并确定它是值还是变量。 如果是,则将参数推入堆栈。 如果不是,那就是运营商。
- 如果您有一个运算符,则创建一个树,该树由作为根的运算符和作为其子项的堆栈的许多参数组成。 你将树推到堆栈上。
- 当您想要打印中缀表示法时,您可以执行堆栈顶部的有序遍历(原始的修复后表示法只是同一树的后序步行)。
为了在C ++中处理这个问题,我创建了一个基类( Expression
),其派生类表示不同类型的节点( Value
, Variable
和BinaryOperation
)并维护std::stack
。 将其编码主要是打字练习。