用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 相关文章推荐
3
Oct 09 PHP
mysql总结之explain
Feb 27 PHP
基于PHP异步执行的常用方式详解
Jun 03 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
Mar 17 PHP
ThinkPHP之A方法实例讲解
Jun 20 PHP
php数组键名技巧小结
Feb 17 PHP
php使用指定编码导出mysql数据到csv文件的方法
Mar 31 PHP
PHP编写的图片验证码类文件分享
Jun 06 PHP
php求数组全排列,元素所有组合的方法总结
Mar 14 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
laravel框架中视图的基本使用方法分析
Nov 23 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
大师制作的中短波矿石收音机
2020/04/02 无线电
PHP中PDO事务处理操作示例
2018/05/02 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
jquery text(),val(),html()方法区别总结
2013/11/04 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
详解ES6中的代理模式——Proxy
2018/01/08 Javascript
深入浅析AngularJs模版与v-bind
2018/07/06 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
Vue.js暴露方法给WebView的使用操作
2020/09/07 Javascript
Python编程实现数学运算求一元二次方程的实根算法示例
2017/04/02 Python
python中requests库session对象的妙用详解
2017/10/30 Python
Python排序搜索基本算法之堆排序实例详解
2017/12/08 Python
Python tkinter事件高级用法实例
2018/01/31 Python
Django中针对基于类的视图添加csrf_exempt实例代码
2018/02/11 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
Python给图像添加噪声具体操作
2019/03/03 Python
用 Python 制作地球仪的方法
2020/04/24 Python
使用OpenCV去除面积较小的连通域
2020/07/05 Python
美国诺德斯特龙百货官网:Nordstrom
2016/08/23 全球购物
公司活动策划方案
2014/01/13 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
放弃继承权公证书
2015/01/23 职场文书
天堂的孩子观后感
2015/06/11 职场文书
投诉信回复范文
2015/07/03 职场文书
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS