- $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://www.codesnippet.cn/detail/250920136136.html
来源: http://www.codesnippet.cn/detail/250920136136.html