Расчет польского выражения

Я ищу что-то, что объясняет, как я могу рассчитать Polish Expression, пример:

если у меня есть это ((1+2)*4)+3по-нормальному 1+2*4+3 = 15, но мне нужно написать так: 12+4*3+ использовать stack получить значение top и снова поместить в стек, см. мой код: https://ideone.com/0bdkkM

я уже вижу один пост, но я не понимаю, как я могу сделать необходимые операции: Stackru

2 ответа

Решение

Вот простой оценщик RPN, без какой-либо обработки ошибок. Вам нужен только стек для хранения операндов, а не операторов, что делает его довольно простым для реализации.

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

std::stack<int> stack;

const char *expression="12+4*3+";

for(char c=*expression; c!=0; c=*expression++)
{
    switch(c)
    {
        case '+':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs+rhs;
            stack.push(result);
            break;
        }

        case '-':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs-rhs;
            stack.push(result);
            break;
        }

        case '*':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs*rhs;
            stack.push(result);
            break;
        }

        case '/':
        {
            int rhs=stack.top();    stack.pop();
            int lhs=stack.top();    stack.pop();
            int result=lhs/rhs;
            stack.push(result);
            break;
        }

        default:
            int number=(c-'0');
            stack.push(number);
            break;
    }
}

int final_result=stack.top();
std::cout << "result is " << final_result << std::endl;

Причина, по которой Reverse Polish стала популярной, заключается в том, что она хорошо сочетается с компьютерной концепцией стека.

Когда пользователь вводит число, поместите его в стек.

Когда пользователь вводит оператор, извлекает 2 числа из стека, вычисляет результат и помещает результат обратно в стек.

Другие вопросы по тегам