postifx для добавления двоичного дерева выражений (скобок) с использованием стека

У меня есть программа (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);
}
}

Так что моя проблема заключается в правильном размещении скобок.
Любая помощь будет принята с благодарностью, это выходные, так что мои TA / учителя не вернулись ко мне.

редактировать: избыточные круглые скобки не допускаются. Он должен быть размещен соответствующим образом, когда это необходимо, но не тогда, когда это не нужно.

0

Решение

Вам не нужно знать приоритет оператора. Это уже подразумевается в постфиксе. Вам просто нужно поместить скобки вокруг каждого кортежа операнд-оператор-операнд, когда вы выводите их. Так, например, ab+ становится (a+b), abc++ становится (a+(b+c)). Так что просто выведите «(» в начале printInfixExpression() и «)» в конце. Вы получите лишние скобки, но я не вижу в вашем вопросе ничего о том, как их подавить.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]