postfix使用堆栈中缀二进制表达式树(括号)

时间:2014-03-31 02:51:09

标签: c++ stack postfix-notation infix-notation

我有一个程序(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 /老师还没有回到我的身边。

编辑:不允许使用冗余括号。它必须在必要时适当放置,但不是在没有必要的时候放置。

1 个答案:

答案 0 :(得分:0)

您无需了解运算符优先级。它已经隐含在后缀中。您只需要在输出时将括号放在每个操作数 - 运算符 - 操作数元组周围。例如,ab+变为(a+b), abc++变为(a+(b+c)).因此只需在printInfixExpression()的开头输出“(”)并在结尾输出“)”它的。你会得到多余的括号,但我没有在你的问题中看到任何关于抑制它们的内容。