я ищу что-то, что объясняет, как я могу рассчитать Polish Expression
, пример:
если у меня есть это ((1+2)*4)+3
по-нормальному 1+2*4+3 = 15
, но мне нужно
напишите так: 12+4*3+
использовать stack
получить значение top и снова поместить в стек, смотрите мой код: https://ideone.com/0bdkkM
я уже вижу один пост, но я не понимаю, как я могу сделать необходимые операции: Переполнение стека
Вот простой оценщик 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 числа из стека, вычисляет результат и помещает результат обратно в стек.