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


Posted in PHP onAugust 02, 2011

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; 
} 
}

这个实现方式中使用了两个堆栈,一个用来存储数字,一个用来存储运算符,遇到括号以后就递归进入括号内运算,实现方式有点笨拙,后面补充一下“逆波兰表达式”的算法实现。
PHP 相关文章推荐
PHP 开发环境配置(测试开发环境)
Apr 28 PHP
JS异常处理try..catch语句的作用和实例
May 05 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
基于PHP后台的Android新闻浏览客户端
May 23 PHP
yii2 resetful 授权验证详解
May 18 PHP
使用Zttp简化Guzzle 调用
Jul 02 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
php递归函数怎么用才有效
Feb 24 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
用php定义一个数组最简单的方法
Oct 04 PHP
PHP5 的对象赋值机制介绍
Aug 02 #PHP
利用PHP实现智能文件类型检测的实现代码
Aug 02 #PHP
10条PHP高级技巧[修正版]
Aug 02 #PHP
PHP获取url的函数代码
Aug 02 #PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 #PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 #PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 #PHP
You might like
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
thinkPHP实现基于ajax的评论回复功能
2018/06/22 PHP
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
Jquery实现弹性滑块滑动选择数值插件
2015/08/08 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
jQuery Ajax全解析
2017/02/13 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
vue-router路由懒加载和权限控制详解
2017/12/13 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
微信小程序报错: thirdScriptError的错误问题
2020/06/19 Javascript
Python实现的爬虫功能代码
2017/06/24 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
解决python 输出是省略号的问题
2018/04/19 Python
python删除不需要的python文件方法
2018/04/24 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
《回乡偶书》教学反思
2014/04/12 职场文书
工程售后服务方案
2014/06/08 职场文书
2015年财政所工作总结
2015/04/25 职场文书