簡體   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