php实现简单表达式运算算法
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
- 上一篇:php代码获取 百度收录和百度快照时间
- 下一篇:php 分页类——尾部页码导航
精彩图集
精彩文章






