将表示数学表达式的树转换为没有多余括号的字符串

时间:2018-11-25 11:58:41

标签: java c# .net algorithm visitor

我想将表示数学表达式一棵树转换为实际的数学表达式(像"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)

请注意多余的括号。

所以问题是:如何让我的访问者生成没有多余括号的字符串?

2 个答案:

答案 0 :(得分:1)

您需要一个运算符优先级表。只需将优先级值分配给您支持的每个运算符(也许分配给最外层的括号的最前面的无操作数)。然后,对于每个操作节点,如果其操作的优先级高于父节点操作,则不需要括号。

答案 1 :(得分:1)

就像NelFeal在树上行走时所写的那样,您只需要检查子操作的优先级是否小于当前操作的优先级即可。

我为您实现了访客模式,希望对您有所帮助。

Component.defaultProps = {
  element.value1: '#'
}

Component.defaultProps = {
  this.props.element.value1: '#'
}
  

(5 + 6)^(5 * 6)*(1 * 2 + -7)