Я успешно реализовал алгоритм маневрирования в C ++, чтобы преобразовать инфиксное выражение в постфиксное выражение (RPN). Мне нужно изменить мой алгоритм, чтобы он возвращал префиксное (польское) выражение, и я не знаю как.
void Prefix::fromInfix()
{
//The stack contain the operators
std::stack<std::string> pile;
//This is the output
std::vector<std::string> sortie;
//The input is the std::vector<std::string> _expression
pile.push("(");
_expression.push_back(")");
for (auto iter = _expression.begin(); iter != _expression.end(); iter++)
{
//statOperator detect if the token is an operator and the priority of the operator.
short op = statOperator(*iter);
if (*iter == "(")
pile.push(*iter);
else if (*iter == ")")
{
while (pile.top() != "(")
{
sortie.push_back(pile.top());
pile.pop();
}
pile.pop();
}
else if (op)
{
while (!pile.empty())
{
short op2 = statOperator(pile.top());
//if op2 is is have the priority and isn't a parenthesis.
if (op <= op2 && op2 != 3)
{
sortie.push_back(pile.top());
pile.pop();
}
else
break;
}
pile.push(*iter);
}
else
sortie.push_back(*iter);
}
_expression = sortie;
}
Мне просто нужно было прочитать ввод справа налево.
for (auto iter = _expression.rbegin(); iter != _expression.rend(); iter++)
Полностью поменять роль скобок.
_expression.insert(_expression.begin(), "(");
pile.push(")");
И в цикле.
if (*iter == ")")
pile.push(*iter);
else if (*iter == "(")
{
while (pile.top() != ")")
{
sortie.push(pile.top());
pile.pop();
}
pile.pop();
}
И обратный вывод (я использовал стек).
while (!sortie.empty())
{
_expression.push_back(sortie.top());
sortie.pop();
}
Других решений пока нет …