У меня есть программа (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 / учителя не вернулись ко мне.
редактировать: избыточные круглые скобки не допускаются. Он должен быть размещен соответствующим образом, когда это необходимо, но не тогда, когда это не нужно.
Вам не нужно знать приоритет оператора. Это уже подразумевается в постфиксе. Вам просто нужно поместить скобки вокруг каждого кортежа операнд-оператор-операнд, когда вы выводите их. Так, например, ab+
становится (a+b),
abc++
становится (a+(b+c)).
Так что просто выведите «(» в начале printInfixExpression()
и «)» в конце. Вы получите лишние скобки, но я не вижу в вашем вопросе ничего о том, как их подавить.
Других решений пока нет …