<?php
// Польская нотация. Реализация алгоритма с рекурсией
function polish_recursive($str) {
// подчистить строку и разделить ее на "стек"
$stack=explode(' ',trim(preg_replace('/[[:space:]]{2,}/',' ',$str)));
$cnt=count($stack);
// если в стеке более 1 элемента
if ($cnt>1) {
// debug
//echo join(' ',$stack).'<br>';
// пройтись по стеку
for ($i=0; $i<$cnt; $i++) {
if (in_array($stack[$i], array('-', '+', '*', '/', '^'))) {
if ($i<2) { return 'error'; }
// выполнить операцию, записать в "стек" результат
eval('$stack[$i]=$stack[($i-2)]'.$stack[$i].'$stack[($i-1)];');
// изъять из "стека" операнды
unset($stack[($i-1)]);
unset($stack[($i-2)]);
break;
}
else {
// не арифметический знак и не число
if (!is_numeric($stack[$i])) { return 'error'; }
}
}
// в стеке ничего не изменилось после выполнения цикла
if ($cnt==count($stack)) { return 'error'; }
// следующий рекурсивный проход
$str=polish_recursive(join(' ',$stack));
}
// результат
return($str);
}
echo polish_recursive('(a+b)*c^d^e-f/(g+h/i)')