我想将表示数学表达式的一棵树转换为实际的数学表达式(像"a+b/c"
这样的字符串)
树表示法是您可以想象的最简单的方法:
A+B/C
将是这棵树:
OperationNode(+, A, OperationNode(/, B, C))
(A+B)/C
就是这棵树:
OperationNode(/, OperationNode(+, A, B), C)
为了将树转换为字符串,我使用了Visitor模式。问题出在括号里。
我当前的Visitor实现总是向节点添加括号,因此我生成的每棵树都变成了这样的字符串:
(((((A + B)+ C)+ D)
请注意多余的括号。
所以问题是:如何让我的访问者生成没有多余括号的字符串?
答案 0 :(得分:1)
您需要一个运算符优先级表。只需将优先级值分配给您支持的每个运算符(也许分配给最外层的括号的最前面的无操作数)。然后,对于每个操作节点,如果其操作的优先级高于父节点操作,则不需要括号。
答案 1 :(得分:1)
就像NelFeal在树上行走时所写的那样,您只需要检查子操作的优先级是否小于当前操作的优先级即可。
我为您实现了访客模式,希望对您有所帮助。
Component.defaultProps = {
element.value1: '#'
}
Component.defaultProps = {
this.props.element.value1: '#'
}
(5 + 6)^(5 * 6)*(1 * 2 + -7)