【问题标题】:Find answer to string equation without using eval()在不使用 eval() 的情况下查找字符串方程的答案
【发布时间】:2010-12-20 17:27:58
【问题描述】:

我需要一种方法来获取作为字符串给出的等式并找到它的数学答案,最大的警告是我不能使用 eval()。

我知道等式只会包含数字、四个数学运算符(即 * / + -)和括号,字符串中可能有也可能没有空格。这里有几个例子。

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

我猜它必须使用某种正则表达式来完成?

【问题讨论】:

标签: php regex eval


【解决方案1】:

数学表达式不规则。他们是context-free

最好的办法是使用众所周知的数学解析算法来解析它们,例如 the shunting yard algorithm。您只需要担心在 PHP 中实现算法。你甚至可以在网上找到它的 PHP 实现。

【讨论】:

  • 仅仅阅读问题的答案就能学到很多东西,真是令人惊讶!这对我来说是新的,酷! +1
  • 这会让你领先一步:$tokens = token_get_all('<?php ' . $expression)
【解决方案2】:

以防万一有人对这里感兴趣的是我在 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 2020-02-05
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多