【问题标题】:postifx to infix binary expression tree (parenthesis) using stack使用堆栈中缀二进制表达式树(括号)的后缀
【发布时间】:2014-05-10 06:41:56
【问题描述】:

我有一个程序 (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);
  }
}

这是输出不带括号的中缀的原始函数:

void BET::printInfixExpression(BinaryNode *n)
{
  if(n->left != NULL)
  {
    printInfixExpression(n->left);
  }
  cout << n->element << " ";

  if(n->right != NULL)
  {
    printInfixExpression(n->right);
  }
}

所以我的问题是正确放置括号。 任何帮助将不胜感激,现在是周末,所以我的助教/老师还没有回复我。

edit:不允许使用多余的括号。它必须在必要时适当放置,而不是在不必要时放置。

【问题讨论】:

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


    【解决方案1】:

    您不需要知道运算符的优先级。它已经隐含在后缀中。您只需要在输出它们时在每个操作数-操作数-操作数元组周围加上括号。例如,ab+ 变为 (a+b), abc++ 变为 (a+(b+c)). 所以只需在 printInfixExpression() 的开头输出一个“(”,在它的末尾输出一个“)”。你会得到多余的括号,但我在你的问题中看不到任何关于抑制这些的内容。

    【讨论】:

    • 这是一个很好的解决方案,没想到会这样。不幸的是,我不能有多余的括号......很抱歉没有在文章中包括那个
    • 另一件事,我不知道你为什么会有一棵树。 Postfix 不是树,它是线性的。您将只有一个操作数和运算符流,以及一个用于评估它们的堆栈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2011-06-13
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多