Heim > php教程 > PHP源码 > php实现简单表达式运算算法

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

PHP中文网
Freigeben: 2016-05-25 17:07:54
Original
1023 Leute haben es durchsucht

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

求一个表达式运算结果

$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 &#39;+&#39;:
               return (double)($data1+$data2);
           case &#39;-&#39;:
               return (double)($data1-$data2);
           case &#39;*&#39;:
               return (double)($data1*$data2);
           case &#39;/&#39;:
               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;
Nach dem Login kopieren


                   

以上就是php实现简单表达式运算算法的内容,更多相关内容请关注PHP中文网(www.php.cn)!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage