[英]postifx to infix binary expression tree (parenthesis) using stack
我有一个程序(c ++),我正在编写将后缀表达式转换为中缀的地方
后缀示例:ab + cde + * *转换为中缀:(a + b)*(c *(d + e))
您可以通过在二进制表达式树中“有序”遍历来完成此操作
我有一个递归函数,可以正确打印出表达式,但是我不太清楚如何将寄生虫放置在正确的位置。 我最好的尝试是结果(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);
}
}
所以我的问题是正确放置括号。 任何帮助将不胜感激,这是周末,所以我的助教/老师没有回到我身边。
编辑:多余的括号是不允许的。 必须在必要时适当放置它,而在不必要时则不必放置。
您不需要知道运算符的优先级。 它已经隐含在后缀中。 输出它们时,只需在每个操作数-运算符-操作数元组的周围加上括号。 因此,例如, ab+
变为(a+b),
abc++
变为(a+(b+c)).
因此,只需在printInfixExpression()
的开头输出一个“(”,并在其结尾输出一个“)”。 您会得到多余的括号,但您的疑问中没有任何关于抑制括号的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.