2015-04-08 5 views
0

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

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

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

+8

'1243 + * +' не является обратной польской обозначением для '((1 + 2) * 4) + 3'. '12 + 4 * 3 +' есть. –

+0

Wikipedia имеет [статью с хорошим объяснением и алгоритмом] (http://en.wikipedia.org/wiki/Reverse_Polish_notation) о RPN. – legends2k

+0

Nice SO post: http://stackoverflow.com/questions/12023151/prefixpolish-notation-evaluation-c – NathanOliver

ответ

1

Вот простой оценщик 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; 
1

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

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

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

+0

Вам также необходимо рассмотреть приоритет оператора – Sean

+2

@ Не используйте, вы так не делаете, это делает обратный польский настолько простым. Пользователь отвечает за переупорядочение выражения для приоритета. –

+0

Это происходит, если вы конвертируете выражение в RPN. – Sean