zoukankan      html  css  js  c++  java
  • 用PHP实现的四则运算表达式计算

    简介:这是用PHP实现的四则运算表达式计算的详细页面,介绍了和php,有关的知识、技巧、经验,和一些php源码等。

    class='pingjiaF' frameborder='0' src='http://biancheng.dnbcw.info/pingjia.php?id=342053' scrolling='no'>

    题目要求:有一个四则运算的字符串表达式,编写一个函数,计算四则运算的结果

    PHP实现:

     1 <?php
     2 
     3 /**
     4  * 计算四则运算表达式
     5  */
     6 
     7 error_reporting(E_ALL);
     8 
     9 $exp = '(1+2*(3+5)/4)*(3+(5-4)*2)';
    10 $arr_exp = array();
    11 
    12 for($i=0;$i<strlen($exp);$i++){
    13     $arr_exp[] = $exp[$i];
    14 }
    15 $result = calcexp( array_reverse($arr_exp) );
    16 echo $exp . '=' . $result;
    17 
    18 function calcexp( $exp ){
    19     $arr_n = array();
    20     $arr_op = array();
    21     
    22     while( ($s = array_pop( $exp )) != '' ){
    23         if( $s == '(' ){
    24             $temp = array(); $quote = 1; $endquote = 0;
    25             while( ($t = array_pop($exp)) != '' ){
    26                 if( $t == '(' ){
    27                     $quote++;
    28                 }
    29                 if( $t == ')' ){
    30                     $endquote++;
    31                     if( $quote == $endquote ){
    32                         break;
    33                     }
    34                 }
    35                 array_push($temp, $t);
    36             }
    37             $temp = array_reverse($temp);
    38             array_push($arr_n, calcexp($temp) );
    39         }else if( $s == '*' || $s == '/' ){
    40             $n2 = array_pop($exp);
    41             if( $n2 == '(' ){
    42                 $temp = array(); $quote = 1; $endquote = 0;
    43                 while( ($t = array_pop($exp)) != '' ){
    44                     if( $t == '(' ){
    45                         $quote++;
    46                     }
    47                     if( $t == ')' ){
    48                         $endquote++;
    49                         if( $quote == $endquote )
    50                             break;
    51                     }
    52                     array_push($temp, $t);
    53                 }
    54                 $temp = array_reverse($temp);
    55                 $n2 = calcexp($temp);
    56             }
    57             
    58             $op = $s;
    59             $n1 = array_pop($arr_n);
    60             
    61             $result = operation($n1, $op, $n2);
    62             array_push($arr_n, $result);
    63         }elseif( $s == '+' || $s == '-' ){
    64             array_push($arr_op, $s);
    65         }else{
    66             array_push($arr_n, $s);
    67         }
    68     }
    69     
    70     $n2 = array_pop($arr_n);
    71     while( ($op = array_pop($arr_op)) != '' ){
    72         $n1 = array_pop($arr_n);
    73         $n2 = operation($n1, $op, $n2);
    74     }
    75     
    76     return $n2;
    77 }
    78 
    79 function operation( $n1, $op, $n2 ){
    80     switch ($op) {
    81         case '+':
    82             return intval($n1) + intval($n2);
    83             break;
    84         case '-':
    85             return intval($n1) - intval($n2);
    86             break;
    87         case '*':
    88             return intval($n1) * intval($n2);
    89             break;
    90         case '/':
    91             return intval($n1) / intval($n2);
    92             break;
    93     }

    94 } 

    这个实现方式中使用了两个堆栈,一个用来存储数字,一个用来存储运算符,遇到括号以后就递归进入括号内运算,实现方式有点笨拙,后面补充一下“逆波兰表达式”的算法实现。 

    爱J2EE关注Java迈克尔杰克逊视频站JSON在线工具

    http://biancheng.dnbcw.info/php/342053.html pageNo:6
  • 相关阅读:
    OOP & Pointer: Segment Tree
    ICPC_2020 上海站
    Notes: Kirchhoff's Matrix 基尔霍夫矩阵
    CS61A Homework: Church Numerals
    题解:[COCI2011-2012#5] BLOKOVI
    题解:SDOI2017 新生舞会
    题解:POI2012 Salaries
    题解:洛谷P1357 花园
    题解:CF593D Happy Tree Party
    题解 P2320 【[HNOI2006]鬼谷子的钱袋】
  • 原文地址:https://www.cnblogs.com/ooooo/p/2243893.html
Copyright © 2011-2022 走看看