用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中的内存管理问题
Aug 31 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php实现单链表的实例代码
Mar 22 PHP
基于wordpress主题制作的具体实现步骤
May 10 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
php发送邮件的问题详解
Jun 22 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
PHP memcache在微信公众平台的应用方法示例
Sep 13 PHP
PHP 多任务秒级定时器的实现方法
May 13 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
php实现读取超大文件的方法
2014/07/28 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
jQuery的实例及必知重要的jQuery选择器详解
2016/05/20 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
获取select的value、text值的简单示例(jquery与javascript)
2016/12/07 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
[01:11]回顾历届DOTA2国际邀请赛中国区预选赛
2017/06/26 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
Python中的多重装饰器
2015/04/11 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Python决策树之基于信息增益的特征选择示例
2018/06/25 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
机器学习实战之knn算法pandas
2019/06/22 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
python多线程同步之文件读写控制
2021/02/25 Python
Python多线程爬取豆瓣影评API接口
2019/10/22 Python
python 实现生成均匀分布的点
2019/12/05 Python
Python实现序列化及csv文件读取
2020/01/19 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
制药工程专业应届生求职信
2013/09/24 职场文书
函授教育个人学习的自我评价
2013/12/31 职场文书
物业工作计划书
2014/01/10 职场文书
德育标兵事迹材料
2014/08/24 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
幼儿园六一儿童节演讲稿
2015/03/19 职场文书
学校食堂食品安全承诺书
2015/04/29 职场文书
CSS完成视差滚动效果
2021/04/27 HTML / CSS
十大最强岩石系宝可梦,怪颚龙实力最强,第七破坏力很强
2022/03/18 日漫
在 Python 中利用 Pool 进行多线程
2022/04/24 Python