博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用PHP实现的四则运算表达式计算
阅读量:2239 次
发布时间:2019-05-09

本文共 2225 字,大约阅读时间需要 7 分钟。

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

 

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

你可能感兴趣的文章
理解事务的4种隔离级别
查看>>
常用正则匹配符号
查看>>
建议42: 让工具类不可实例化
查看>>
Java 异步机制与同步机制的区别
查看>>
hibernate的对象三种状态说明
查看>>
什么是N+1查询?
查看>>
Spring 接管 Hibernate 配置 延迟加载
查看>>
找出不在预定数组中的自然数
查看>>
String常见面试题
查看>>
直插,快排,堆排,归并排序的分析
查看>>
二叉树的各种操作(面试必备)
查看>>
oracle
查看>>
泛型与通配符详解
查看>>
BaseServiceImpl中的实现关键点
查看>>
Struts2中的session、request、respsonse获取方法
查看>>
如何理解MVC模型
查看>>
SpringMVC中乱码解决方案
查看>>
SpringMVC中时间格式转换的解决方案
查看>>
post和get请求相关知识点
查看>>
关于try finally 中的return语句的问题
查看>>