我有一个程序(c ++)我写的是我将后缀表达式转换为中缀
实施例 后缀:a b + c d e + * * 转换为中缀:(a + b)*(c *(d + e))
你通过遍历" inorderly"来做到这一点。通过二进制表达式树
我有一个递归函数可以正确打印出表达式,但我无法弄清楚如何将paranthesis放在正确的位置。 我最好的尝试是结果(a + b)*(c *(d + e //但是我不能正确地放置最后的括号而不会弄乱其他部分
这是产生这一结果的功能(我非常确定我需要重新考虑我的策略以获得一致的结果:
//isHigher is a lamba function that checks for higher precedence operators (*, /)
//isoperator checks if its an operator (+, - , / * )
void BET::printInfixExpression(BinaryNode *n)
{
if(n->left != NULL)
{
if(isOperator(n->left->element) && isHigher(n->element) && !isHigher(n->left->element))
cout << "( ";
if(isHigher(n->element) && !isOperator(n->left->element))
cout << "( ";
printInfixExpression(n->left);
}
if(isHigher(n->element) && isHigher(n->right->element))
cout << ") ";
cout << n->element << " ";
if(isHigher(n->element) && isOperator(n->right->element) && !isHigher(n->right->element))
cout << "( ";
if(n->right != NULL)
{
printInfixExpression(n->right);
}
}
这是输出没有括号的中缀的原始函数:
void BET::printInfixExpression(BinaryNode *n)
{
if(n->left != NULL)
{
printInfixExpression(n->left);
}
cout << n->element << " ";
if(n->right != NULL)
{
printInfixExpression(n->right);
}
}
所以我的问题是正确放置括号。 非常感谢任何帮助,这是周末所以我的TA /老师还没有回到我的身边。
编辑:不允许使用冗余括号。它必须在必要时适当放置,但不是在没有必要的时候放置。
答案 0 :(得分:0)
您无需了解运算符优先级。它已经隐含在后缀中。您只需要在输出时将括号放在每个操作数 - 运算符 - 操作数元组周围。例如,ab+
变为(a+b),
abc++
变为(a+(b+c)).
因此只需在printInfixExpression()
的开头输出“(”)并在结尾输出“)”它的。你会得到多余的括号,但我没有在你的问题中看到任何关于抑制它们的内容。