繁体   English   中英

postifx使用堆栈来固定二进制表达式树(括号)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM