用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 相关文章推荐
BBS(php &amp; mysql)完整版(八)
Oct 09 PHP
smarty实例教程
Nov 19 PHP
让的PHP代码飞起来的40条小技巧(提升php效率)
Apr 12 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
PHP批量删除、清除UTF-8文件BOM头的代码实例
Apr 14 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 20 PHP
详细解读php的命名空间(二)
Feb 21 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
Sep 16 PHP
ThinkPHP5分页paginate代码实例解析
Nov 10 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
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
php车辆违章查询数据示例
2016/10/14 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
easyui datagrid 键盘上下控制选中行示例
2014/03/31 Javascript
js实现显示当前状态的导航效果代码
2015/08/28 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
JavaScript定时器setTimeout()和setInterval()详解
2017/08/18 Javascript
如何编写一个d.ts文件的步骤详解
2018/04/13 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
详解redux异步操作实践
2018/08/15 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
Python基于dom操作xml数据的方法示例
2018/05/12 Python
基于anaconda下强大的conda命令介绍
2018/06/11 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
python可视化爬虫界面之天气查询
2019/07/03 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
环境科学专业个人求职的自我评价
2013/11/28 职场文书
毕业生就业意向书
2014/04/01 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
群众路线剖析材料范文
2014/10/09 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
关于mysql中string和number的转换问题
2022/06/14 MySQL