c++二进制表达式树:如何打印带有适当括号的中缀表达式
C++ Binary Expression Tree: How do I print an infix expression with appropriate parentheses?
现在我有这个简单的打印算法,打印完美括号。问题是,括号并不总是必需的,我需要弄清楚如何在不需要它们时不打印它们。
我的当前功能:
void printIn(Node* t){
if(t!= NULL) {
if(isleafNode(t))
cout << t->element;
else {
cout << "(";
printIn(t->left);
cout << t->data;
printIn(t->right);
cout << ")";
}
}
这里的问题是一些后缀表达式,例如2 50 + 8 +可以以中缀形式打印为2 + 50 + 8而不是((2 + 50)+ 8))
下面是后缀和中缀的图表。我的只是在整个外部加上括号,以及所有的加法。
4 50 6 + + 4 + ( 50 + 6 )
4 50 + 6 + 4 + 50 + 6
4 50 + 6 2 * + 4 + 50 + 6 * 2
4 50 6 + + 2 * ( 4 + ( 50 + 6 ) ) * 2
a b + c d e + * * ( a + b ) * ( c * ( d + e ) )
下面是我的照片:
4 50 6 + + ( 4 + ( 50 + 6 ))
4 50 + 6 + ( ( 4 + 50 ) + 6)
4 50 + 6 2 * + ( ( 4 + 50 ) + ( 6 * 2 ) )
4 50 6 + + 2 * ( ( 4 + ( 50 + 6 ) ) * 2 )
a b + c d e + * * ( ( a + b) * ( c * ( d + e ) ) )
我如何修复我的算法以消除额外的括号?p请记住,我确实有一个getPrecedence(string)函数,它返回1表示高优先级(*或/),返回0表示低优先级(+或-)
当以中缀形式打印表达式树时,您只需要在子表达式(即子表达式)周围打印圆括号,其中操作符的优先级低于主表达式(即父表达式)的操作符。
以下列表达式树(后缀表示法)及其中缀形式为例:
4 5 6 + 7 * + 4 + (5 + 6) * 7
注意,在5 + 6附近需要括号,因为子表达式5 6 +的操作符比主表达式5 6 + 7 *的操作符优先级低,但子表达式5 6 + 7 *不需要括号,因为子表达式5 6 + 7 *的操作符优先级高于主表达式4 5 6 + 7 * +
使用这些信息可以很容易地修改问题中的算法,以避免在不需要时使用括号。请注意,由于树中没有父指针,因此让父指针检查是否有任何子指针需要括号比让节点在自己周围加上括号更容易。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 来自C++结构编程中的中缀表达式的表达式树
- 中缀到后缀表达式转换代码不起作用
- 使用Stacks从中缀表达式转换为后缀(C++)
- 验证和中缀表达式
- c++二进制表达式树:如何打印带有适当括号的中缀表达式
- 从中缀表达式构建二叉树,而不使用堆栈