Blog. Just Blog

Решение примера в обратной польской нотации

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Обратная польская нотация - один из классических алгоритмов, используемых в вычислительной технике. Он используется для вычислений, и особенностью является следование символов операций за символами операндов, а также в отсутствии скобок. Если интересно, можете почитать описание алгоритма польской нотации. Листая сайт с вакансиями, я наткнулся на одно предложение работы, где в качестве тестового задания требовалось написать функцию, которая получает строку примера, записанного в обратной польской нотации, и возвращает результат вычислений. Сама вакансия для меня никакого интереса не представляла, с работой у меня все в порядке, а задание показалось интересным. Вот что у меня сперва получилось.
  1. // Польская нотация. Реализация алгоритма с рекурсией
  2. function polish_recursive($str) {
  3.     // подчистить строку и разделить ее на "стек"
  4.     $stack=explode(' ',trim(preg_replace('/[[:space:]]{2,}/',' ',$str)));
  5.  
  6.     $cnt=count($stack);
  7.     // если в стеке более 1 элемента
  8.     if ($cnt>1) {
  9.         // debug
  10.         //echo join(' ',$stack).'<br>';
  11.  
  12.         // пройтись по стеку
  13.         for ($i=0$i<$cnt$i++) {
  14.             // знак арифметического действия?
  15.             if (in_array($stack[$i], array('-''+''*''/'))) {
  16.                 // слева осталось меньше двух цифр?
  17.                 if ($i<2) { return 'error'; }
  18.                 // выполнить операцию, записать в "стек" результат
  19.                 eval('$stack[$i]=$stack[($i-2)]'.$stack[$i].'$stack[($i-1)];');
  20.                 // изъять из "стека" операнды
  21.                 unset($stack[($i-1)]);
  22.