Frage

Ich brauche eine Möglichkeit, eine Gleichung zu nehmen, die als Saite angegeben ist und die mathematische Antwort ist, die große Einschränkung ist, dass ich Eval () nicht verwenden kann.

Ich weiß, dass die Gleichung immer nur Zahlen enthalten wird, die vier mathematischen Operatoren (dh * / + -) und Klammern, die möglicherweise Leerzeichen in der Zeichenfolge haben oder nicht. Hier sind ein paar Beispiele.

4 * 4
4+6/3
(3 / 2)*(4+8)
(4+8) * 2

Ich vermute, dass es mit einer Art Regex erledigt werden muss?

War es hilfreich?

Lösung

Mathematikausdrücke sind nicht regelmäßig. Sie sind kontextfrei.

Am besten analysieren Sie sie mit bekannten mathematischen Parsing-Algorithmen wie Der Shunt Hofalgorithmus. Alles, was Sie sich Sorgen machen müssen, ist die Implementierung des Algorithmus in PHP. Möglicherweise können Sie sogar PHP -Implementierungen von IT online finden.

Andere Tipps

Nur für den Fall, dass jemand hier interessiert ist

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top