C++ 使用堆栈将postifx转换为中缀二进制表达式树(括号)
我正在编写一个程序(c++),将后缀表达式转换为中缀 范例 后缀:a b+c d e+** 转换成中缀:(a+b)*(c*(d+e)) 您可以通过“按顺序”遍历二进制表达式树来实现这一点 我有一个递归函数,可以正确地打印出表达式,但我不太明白如何将偏执放在正确的位置。 我最好的尝试是结果(a+b)*(c*(d+e//),但如果不弄乱其他部分,我无法正确放置结束括号 这就是产生这一结果的功能(我非常确定我需要重新思考我的策略以获得一致的结果:C++ 使用堆栈将postifx转换为中缀二进制表达式树(括号),c++,stack,postfix-notation,infix-notation,C++,Stack,Postfix Notation,Infix Notation,我正在编写一个程序(c++),将后缀表达式转换为中缀 范例 后缀:a b+c d e+** 转换成中缀:(a+b)*(c*(d+e)) 您可以通过“按顺序”遍历二进制表达式树来实现这一点 我有一个递归函数,可以正确地打印出表达式,但我不太明白如何将偏执放在正确的位置。 我最好的尝试是结果(a+b)*(c*(d+e//),但如果不弄乱其他部分,我无法正确放置结束括号 这就是产生这一结果的功能(我非常确定我需要重新思考我的策略以获得一致的结果: //isHigher is a lamba funct
//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);
}
}
//isHigher是一个lamba函数,用于检查更高优先级的运算符(*,/)
//等运算符检查其是否为运算符(+、-、/*)
void BET::printInfixExpression(BinaryNode*n)
{
如果(n->left!=NULL)
{
if(等位符(n->left->element)和&isHigher(n->element)和&isHigher(n->left->element))
cout元素)和&!等运算符(n->左->元素)
不能离开);
}
if(isHigher(n->element)和&isHigher(n->right->element))
cout right->element)&!isHigher(n->right->element)
不正确!=空)
{
打印infixexpression(n->右侧);
}
}
这是输出不带括号的中缀的原始函数:
void BET::printInfixExpression(BinaryNode *n)
{
if(n->left != NULL)
{
printInfixExpression(n->left);
}
cout << n->element << " ";
if(n->right != NULL)
{
printInfixExpression(n->right);
}
}
void BET::printInfixExpression(BinaryNode*n)
{
如果(n->left!=NULL)
{
打印infixexpression(n->left);
}
cout元素正确!=NULL)
{
打印infixexpression(n->右侧);
}
}
所以我的问题是正确放置括号。
任何帮助都将不胜感激,因为现在是周末,所以我的助教/老师还没有回复我
编辑:不允许使用多余的括号。它必须在必要时适当放置,但不必在不必要时放置。您不需要知道运算符的优先级。它已经隐含在后缀中。在输出操作数运算符操作数元组时,只需在每个操作数运算符操作数元组周围加上括号。例如,
ab+
变成(a+b),abc++
变成(a+(b+c))。
所以只需在末尾输出a“(printInfixExpression()
的开头和a”)。你会得到多余的括号,但我在你的问题中没有看到任何关于抑制这些括号的内容。这是一个很好的解决方案,我没有这样想。不幸的是,我不能有多余的插入语…很抱歉没有把它包括在写作中。另一件事,我不知道你为什么会有一棵树。后缀不是树,它是线性的。您只需要一个操作数和运算符流,以及一个用于计算它们的堆栈。