我无法解决从后缀到中缀的这个表达式。请帮我详细了解
5 x y - / x y + 3 ^ 7 / +
这不是代码,而是方式,您应该将后缀扩展为中缀::
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<std::shared_ptr<Expression>>
. 编写代码主要是一个打字练习。
后缀中缀:
5 x y - / x y + 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。
这就是转换在计算机科学中有用的原因。