Question

J'ai besoin d'un moyen de prendre une équation donnée sous forme de chaîne et de trouver sa réponse mathématique. Le gros problème est que je ne peux pas utiliser eval ().

Je sais que l’équation ne contiendra jamais que des nombres, les quatre opérateurs mathématiques (c.-à-d. * / + -) et des parenthèses; elle peut avoir ou non des espaces dans la chaîne. Voici quelques exemples.

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

Je suppose que cela va devoir être fait avec une sorte de regex?

Était-ce utile?

La solution

Les expressions mathématiques ne sont pas régulières. Ils sont sans contexte .

La meilleure solution consiste à les analyser à l'aide d'algorithmes d'analyse mathématique bien connus, tels que l'algorithme de parc de triage . Tout ce qui vous préoccupe, c'est de mettre en œuvre l'algorithme en PHP. Vous pourrez même trouver des implémentations PHP en ligne.

Autres conseils

Juste au cas où quelqu'un serait intéressé, voici l'algorithme que j'ai créé en PHP pour produire la notation polonaise inversée

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top