用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 随机数的深入理解
Jun 05 PHP
php读取本地文件常用函数(fopen与file_get_contents)
Sep 09 PHP
使用swoole扩展php websocket示例
Feb 13 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
Jun 12 PHP
利用PHP函数计算中英文字符串长度的方法
Nov 11 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
php+mysqli使用面向对象方式查询数据库实例
Jan 29 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 PHP
php登录超时检测功能实例详解
Mar 21 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
php-fpm中max_children的配置
Mar 15 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 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
我的论坛源代码(十)
2006/10/09 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
php Static关键字实用方法
2010/06/04 PHP
php数组函数序列之array_keys() - 获取数组键名
2011/10/30 PHP
PHP中的use关键字概述
2014/07/23 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
jQuery操作json常用方法示例
2017/01/04 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
jQuery实现的五星点评功能【案例】
2019/02/18 jQuery
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
基于vue3.0.1beta搭建仿京东的电商H5项目
2020/05/06 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
python写入中英文字符串到文件的方法
2015/05/06 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
python flask中动态URL规则详解
2019/11/22 Python
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
小学生志愿者活动方案
2014/08/23 职场文书
超市督导岗位职责
2015/04/10 职场文书
小学生读书笔记范文
2015/06/30 职场文书
感恩父母主题班会
2015/08/12 职场文书
初二英语教学反思
2016/02/15 职场文书
关于使用Redisson订阅数问题
2022/01/18 Redis