C++ 使用堆栈将postifx转换为中缀二进制表达式树(括号)

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

我正在编写一个程序(c++),将后缀表达式转换为中缀

范例 后缀:a b+c d e+** 转换成中缀:(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);
  }
}
//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”)。你会得到多余的括号,但我在你的问题中没有看到任何关于抑制这些括号的内容。

这是一个很好的解决方案,我没有这样想。不幸的是,我不能有多余的插入语…很抱歉没有把它包括在写作中。另一件事,我不知道你为什么会有一棵树。后缀不是树,它是线性的。您只需要一个操作数和运算符流,以及一个用于计算它们的堆栈。