現在我有這個簡單的打印算法打印完美的括號。問題是,括號並不總是必要的,我需要弄清楚如何在不需要時不打印它們。
我目前的職能:
void printIn(Node* t){
if(t!= NULL) {
if(isleafNode(t))
cout << t->element;
else {
cout << "(";
printIn(t->left);
cout << t->data;
printIn(t->right);
cout << ")";
}
}
這裡的問題是一些後綴表達式,如2 50 + 8 +可以在中綴打印為2 + 50 + 8 instad((2 + 50)+ 8))
這是一個後綴圖表,用於中綴它的外觀。我只是在整個外部添加括號,無論如何都要添加。
4 50 6 + + 4 + ( 50 + 6 )
4 50 + 6 + 4 + 50 + 6
4 50 + 6 2 * + 4 + 50 + 6 * 2
4 50 6 + + 2 * ( 4 + ( 50 + 6 ) ) * 2
a b + c d e + * * ( a + b ) * ( c * ( d + e ) )
這是我的樣子圖表:
4 50 6 + + ( 4 + ( 50 + 6 ))
4 50 + 6 + ( ( 4 + 50 ) + 6)
4 50 + 6 2 * + ( ( 4 + 50 ) + ( 6 * 2 ) )
4 50 6 + + 2 * ( ( 4 + ( 50 + 6 ) ) * 2 )
a b + c d e + * * ( ( a + b) * ( c * ( d + e ) ) )
如何修復算法以消除額外的括號? p請記住我有一個getPrecedence(string)函數,它返回1表示高優先級(*或/),0表示低優先級(+或 - )
以中綴形式打印表達式樹時,只需要在子表達式(即子項)周圍打印括號,其中運算符的優先級低於主(即父級)表達式的運算符。
例如,採用以下表達式樹(以後綴表示法)及其中綴形式。
4 5 6 + 7 * + 4 + (5 + 6) * 7
注意,由於子表達式5 6 +的運算符的優先級低於主表達式5 6 + 7 *的運算符,因此需要約5 + 6的括號,但子表達式5 6 + 7不需要它。 *因為運算符的優先級高於主表達式4 5 6 + 7 * +的運算符
使用此信息可以很容易地修改問題中的算法,以避免在不需要時使用括號。請注意,由於樹中沒有父指針,因此如果任何子節點需要括號而不是使節點在其周圍放置括號,則更容易進行父節點檢查。