我无法将转换中缀表达式转换为后置修复,因为我无法正确放置括号。例如,请考虑:3+4*5/6
从左到右我注意到'*'具有更高的优先级。因此我把:3+(4*5)/6
此外,我观察'/',因此:(3+(4*5))/6
但是,这给了我一个错误的后修复表达式。请在我的方法pf中指出括号中的错误。
答案 0 :(得分:0)
您需要解析不同的术语(词法/语法分析)并生成一种抽象语法树。从那时起,您可以将表达式输出到修复后符号。
例如,从左到右解析表达式,没有任何前瞻:
3
,将值存储为操作数+
,检测到它是一个添加4
,将其存储为操作数*
,新操作符的优先级高于当前操作符(+
),因此您必须还原最后一步,创建新上下文并添加4
这个新运营商的操作数。5
,将其存储为操作数/
,具有相同优先级的新运算符,它应该仅在*
之后执行,因此您关闭当前上下文并创建一个新的操作符,用作第一个操作数6
,第二个操作数。最后,从内部上下文开始,将操作符放入操作数,插入括号并对外部上下文执行相同的操作:
4 5 *
4 5 * 6 /
4 5 * 6 / 3 +
或者用前缀表示法:
* 4 5
/ (* 4 5) 6
+ (/ (* 4 5) 6) 3
在你的问题中,你将/
运算符的括号放在整个前一部分而不是前一个操作数上。