php实现四则运算

<?php
 
 /**
  * 计算四则运算表达式
  */
 
 error_reporting(E_ALL);
 
 $exp = '(1+2*(3+5)/4)*(3+(5-4)*2)';
 $arr_exp = array();
 
 for($i=0;$i<strlen($exp);$i++){
     $arr_exp[] = $exp[$i];
 }
 $result = calcexp( array_reverse($arr_exp) );
 echo $exp . '=' . $result;
 
 function calcexp( $exp ){
     $arr_n = array();
     $arr_op = array();
    
     while( ($s = array_pop( $exp )) != '' ){
         if( $s == '(' ){
             $temp = array(); $quote = 1; $endquote = 0;
             while( ($t = array_pop($exp)) != '' ){
                 if( $t == '(' ){
                     $quote++;
                 }
                 if( $t == ')' ){
                     $endquote++;
                     if( $quote == $endquote ){
                         break;
                     }
                 }
                 array_push($temp, $t);
             }
             $temp = array_reverse($temp);
             array_push($arr_n, calcexp($temp) );
         }else if( $s == '*' || $s == '/' ){
             $n2 = array_pop($exp);
             if( $n2 == '(' ){
                 $temp = array(); $quote = 1; $endquote = 0;
                 while( ($t = array_pop($exp)) != '' ){
                     if( $t == '(' ){
                         $quote++;
                     }
                     if( $t == ')' ){
                         $endquote++;
                         if( $quote == $endquote )
                             break;
                     }
                     array_push($temp, $t);
                 }
                 $temp = array_reverse($temp);
                 $n2 = calcexp($temp);
             }
            
             $op = $s;
             $n1 = array_pop($arr_n);
            
             $result = operation($n1, $op, $n2);
             array_push($arr_n, $result);
         }elseif( $s == '+' || $s == '-' ){
             array_push($arr_op, $s);
         }else{
             array_push($arr_n, $s);
         }
     }
    
     $n2 = array_pop($arr_n);
     while( ($op = array_pop($arr_op)) != '' ){
         $n1 = array_pop($arr_n);
         $n2 = operation($n1, $op, $n2);
     }
    
     return $n2;
 }
 
 function operation( $n1, $op, $n2 ){
     switch ($op) {
         case '+':
             return intval($n1) + intval($n2);
             break;
         case '-':
             return intval($n1) - intval($n2);
             break;
         case '*':
             return intval($n1) * intval($n2);
             break;
         case '/':
             return intval($n1) / intval($n2);
             break;
     }
}


?>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值