инфикс алгоритма маневрового двора в префиксную реализацию

0

Я успешно реализовал алгоритм шунтирования в C++, чтобы преобразовать выражение инфикса в постфиксное выражение (RPN). Мне нужно изменить свой алгоритм, чтобы вернуть выражение префикса (polish), и я не знаю, как это сделать.

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;
}
  • 0
    Таким образом, вместо вывода AB +, вы выводите + AB? Если вы понимаете, как шунтирующий двор работает для вывода постфикса, вы должны немного подумать и вывести префикс. Учтите, что postfix - это просто обход по порядку дерева выражений. Префикс является обходом предварительного заказа.
  • 0
    Кстати, в C ++ 11 есть циклы for (string token : _expression) диапазона: for (string token : _expression)
Теги:
algorithm
stack
shunting-yard

1 ответ

0
Лучший ответ

Мне просто нужно было прочитать ввод справа налево.

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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню