龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

php实现简单表达式运算算法

时间:2014-07-16 15:05来源:网络整理 作者:网络 点击:
分享到:
php实现简单表达式运算算法 [代码片段(118行)]
$char=array();  //符号栈
 $number=array();   //数字栈

 $charnum=array('+'=>1,'-'=>1,'*'=>2,'/'=>2);//规定符号栈的优先级

 $arr='4 + 2 * 5 - 7 / 11'; 
// 4 2 5*+7 11/- 逆波兰表达式

 $arr=preg_replace('/(\\\\s+)/','',$arr);
 $len=strlen($arr);
 $flag=0;
 $j=0;
 for($i=0;$i<$len;$i++)
 {
    if(is_numeric($arr[$i]))
    {
        if(!isset($number[$j])) $number[$j]=0;
        if($flag==1) $number[$j]=$number[$j]*10+$arr[$i];
        if($flag!=1) {$number[$j]=(int)$arr[$i];}
        $flag=1;

    }
    if(!is_numeric($arr[$i]) && is_string($arr[$i]))
    {
        $char[]=$arr[$i];
        $j++;
        $flag=2;
    }
 }

 function do_operation($data1,$data2,$symbol)
 {
    switch($symbol)
    {
        case '+':
            return (double)($data1+$data2);
        case '-':
            return (double)($data1-$data2);
        case '*':
            return (double)($data1*$data2);
        case '/':
            return (double) ($data1/$data2);
    }
 }

function change_number(&$arr,$pos,$temp)
{
    $i=$pos;$arr[$i]=$temp;$i++;
    $len=count($arr)-1;
    while($i<$len)
    {
        $arr[$i]=$arr[$i+1];
        $i++;
    }
    unset($arr[$i]);

}

function change_char(&$char,$pos)
{
    $i=$pos;$len=count($char)-1;
    while($i<$len)
    {
        $char[$i]=$char[$i+1];
        $i++;
    }
    unset($char[$i]);

}

function char_value($char,$charnum)
{
    if(array_key_exists($char,$charnum))
    return $charnum[$char];
}

$x1=$x2=0;//两个指针
$result=0;
$lennum=count($number);$lenchar=count($char);
while($x1<$lennum && $x2<$lenchar)
{
    //主要是通过符号来进行运算 所以符号的优先级很重要
    if(isset($char[$x2])&& isset($char[$x2+1]) && char_value($char[$x2],$charnum)>=char_value($char[$x2+1],$charnum))
    {
        if($result==0){

            $result=do_operation($number[$x1],$number[$x1+1],$char[$x2]);
            $x1++;
            $x2++;
        }
        else{
            $result=do_operation($result,$number[$x1],$char[$x2]);
            $x1++;
            $x2++;
        }

    }//到只剩一个符号的时候
    else if($x2==($lenchar-1)){

            $result=do_operation($result,$number[$x1+1],$char[$x2]);
            break;

    }
    else {
                //符号栈要去掉一个符号 然后向前挪动一位 数字栈两位变一位向前挪动一位
                $temp=do_operation($number[$x1+1],$number[$x1+2],$char[$x2+1]);

                change_number($number,$x1+1,$temp);
                change_char($char,$x2+1);
                $lennum=count($number);
                $lenchar=count($char);
                  var_dump($number);
                 var_dump($char); 
                 //if($x2==1) {echo $lenchar;echo $x1;exit;}
    }
}
echo $result;
//该片段来自于http://outofmemory.cn
精彩图集

赞助商链接