用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 相关文章推荐
Adodb的十个实例(清晰版)
Dec 31 PHP
PHP调用Webservice实例代码
Jul 29 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
PHP中的替代语法介绍
Jan 09 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
深入理解PHP的远程多会话调试
Sep 21 PHP
PHP 计算两个特别大的整数实例代码
May 07 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
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PhpDocumentor 2安装以及生成API文档的方法
2014/05/21 PHP
php生成随机数的三种方法
2014/09/10 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
nuxt配置通过指定IP和端口访问的实现
2020/01/08 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python实现句子翻译功能
2017/11/14 Python
python opencv进行图像拼接
2020/03/27 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
python两个list[]相加的实现方法
2020/09/23 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
飞利浦法国官网:Philips法国
2019/07/10 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
简述使用ftp进行文件传输时的两种登录方式?它们的区别是什么?常用的ftp文件传输命令是什么?
2016/11/20 面试题
经济系大学生求职信
2013/10/01 职场文书
个人求职简历的自我评价范文
2013/10/09 职场文书
招聘单位介绍信
2014/01/14 职场文书
土木工程专业推荐信
2014/02/19 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
自我检讨书范文
2015/01/28 职场文书
学生会个人总结范文
2015/02/15 职场文书
2015年加油站工作总结
2015/05/13 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书