Найти ответ на строковое уравнение без использования eval ()
Вопрос
Мне нужен способ взять уравнение, заданное в виде строки, и найти его математический ответ, большое предостережение в том, что я не могу использовать eval ().
Я знаю, что уравнение будет содержать только числа, четыре математических оператора (т.е. * / + -) и круглые скобки, оно может содержать или не содержать пробелы в строке. Вот пара примеров.
4 * 4
4+6/3
(3 / 2)*(4+8)
(4+8) * 2
Я предполагаю, что это должно быть сделано с каким-то регулярным выражением?
Решение
Математические выражения не являются регулярными. Они не зависят от контекста .
Лучше всего разбирать их, используя хорошо известные математические алгоритмы разбора, такие как алгоритм маневрового двора . Все, о чем вам нужно беспокоиться, это реализовать алгоритм на PHP. Возможно, вы даже сможете найти его PHP-реализации онлайн.
Другие советы
На всякий случай, если кто-то заинтересован, это алгоритм, который я придумал в PHP для создания обратной польской нотации
function convertToRPN($equation)
{
$equation = str_replace(' ', '', $equation);
$tokens = token_get_all('<?php ' . $equation);
$operators = array('*' => 1, '/' => 1, '+' => 2, '-' => 2);
$rpn = '';
$stack = array();
$size = count($tokens);
for($i = 1; $i < $size; $i++) {
if(is_array($tokens[$i])) {
$rpn .= $tokens[$i][1] . ' ';
} else {
if(empty($stack) || $tokens[$i] == '(') {
$stack[] = $tokens[$i];
} else {
if($tokens[$i] == ')') {
while(end($stack) != '(') {
$rpn .= array_pop($stack);
}
array_pop($stack);
} else {
while(!empty($stack) && end($stack) != '(' && $operators[$tokens[$i]] >= $operators[end($stack)]) {
$rpn .= array_pop($stack);
}
$stack[] = $tokens[$i];
}
}
}
}
while(!empty($stack)) {
$rpn .= array_pop($stack);
}
return $rpn;
}