题目要求:有一个四则运算的字符串表达式,编写一个函数,计算四则运算的结果
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 }
这个实现方式中使用了两个堆栈,一个用来存储数字,一个用来存储运算符,遇到括号以后就递归进入括号内运算,实现方式有点笨拙,后面补充一下“逆波兰表达式”的算法实现。