2009-11-26 41 views
2

我需要一種以字符串形式給出的方程式,並找到它的數學答案,最重要的是我不能使用eval()。在不使用eval的情況下查找字符串方程的答案()

我知道公式只包含數字,四個數學運算符(即*/+ - )和括號,它可能在字符串中有空格,也可能沒有空格。這裏有幾個例子。

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

我猜測這將是必須用某種正則表達式來完成?

+0

評估串公式的算法是相當容易的時候都這麼簡單。看到半打答案在http://stackoverflow.com/questions/1384811/code-golf-mathematical-expression-evaluator-full-pemdas – 2009-11-26 15:24:57

回答

9

數學表達式不規則。他們是context-free

最好的辦法是使用像這樣的着名的數學解析算法來解析它們。所有你必須擔心的是在PHP中實現算法。你甚至可以在網上找到它的PHP實現。

+1

這是驚人的多少人可以從只讀問題的答案學習!這對我來說很新鮮,很酷! +1 – Ben 2009-11-26 15:23:29

+1

這會給你一個開始:'$ tokens = token_get_all('<?php'。$ expression)' – 2009-11-26 18:03:29

4

以防萬一任何人的興趣這裏是我在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; 
} 
相關問題