用PHP实现的四则运算表达式计算

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

 

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 } 

 

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

转载于:https://www.cnblogs.com/cocowool/archive/2011/07/30/2121956.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值