2014-03-31 26 views
0

我有我正在寫在那裏我轉換後綴表達式來綴postifx使用堆

例 後綴的程序(C++),以中綴二進制表達式樹(括號)轉換爲綴:(A + b)*(C *(d + E))

您通過遍歷 「inorderly」 通過二進制表達式樹

我打印出表達的recursiving功能做到這一點正確的,但我不能完全弄清楚如何將pativehesis放在正確的位置。 我的最佳嘗試是結果(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); 
    } 
} 

所以我的問題越來越括號放置正確任何幫助將不勝感激,這是週末,所以我的助教/老師還沒有回到我身邊。

編輯:冗餘括號是不允許的。它必須在必要時適當放置,但不是在沒有必要時放置。

回答

0

您不需要知道運算符優先級。它已經隱含在後綴中。您只需在輸出時在每個操作數運算符操作數元組的周圍放置括號。因此,例如,ab+變爲(a+b),abc++變成(a+(b+c)).因此,只需在printInfixExpression()開頭輸入「(」,結尾處輸出「)」。你會得到多餘的括號,但是在你關於抑制這些的問題上我沒有看到任何東西。

+0

這是一個很好的解決方案,沒有想到它那樣。不幸的是,我不能有多餘的括號......對不起,在寫作中不包括 – user3050491

+0

另一件事,我不知道爲什麼你會有一棵樹。 Postfix不是一棵樹,它是線性的。你只需要一串操作數和操作符,然後使用堆棧來評估它們。 – EJP