用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 相关文章推荐
PHPShop存在多个安全漏洞
Oct 09 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
php操作xml入门之xml基本介绍及xml标签元素
Jan 23 PHP
php通过array_merge()函数合并关联和非关联数组的方法
Mar 18 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
May 08 PHP
php实现求相对时间函数
Jun 15 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
Aug 16 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 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获取文件夹内文件数的方法
2015/03/12 PHP
php实现求相对时间函数
2015/06/15 PHP
Linux系统下使用XHProf和XHGui分析PHP运行性能
2015/12/08 PHP
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
Angular.JS中select下拉框设置value的方法
2017/06/20 Javascript
深入讲解xhr(XMLHttpRequest)/jsonp请求之abort
2017/07/26 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
python 图片验证码代码分享
2012/07/04 Python
Python多线程爬虫简单示例
2016/03/04 Python
基于Python os模块常用命令介绍
2017/11/03 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
python新手学习可变和不可变对象
2020/06/11 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
pandas 数据类型转换的实现
2020/12/29 Python
SCDKey德国:全球领先的数字游戏市场
2019/04/09 全球购物
打架检讨书50字
2014/01/11 职场文书
上课看小说检讨书
2014/02/22 职场文书
关于青春的演讲稿800字
2014/08/22 职场文书
教师演讲稿开场白
2014/08/25 职场文书
装修活动策划方案
2014/08/27 职场文书
秋季运动会开幕词
2015/01/28 职场文书
大学生心理健康活动总结
2015/05/08 职场文书