php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用
近期一个小项目需要用到公式运算, 所以就进行一些了解,以下内容均属于个人经验。
在PHP中实现公式表达式四则运算大概有两种方法:
1)使用系统函数eval
2)将表达式转换成逆波兰表达式进行计算。
//使用系统函数eval
$str = 'L*((k-J)-(C+k))/M';
$param = array('L' => 0.5, 'k' => 2, 'J' => 1, 'C' => 6, 'M' => 4);
$str2 = '';
for($i = 0; $i < strlen($str); $i++) {
$tmp = substr($str, $i, 1);
if (array_key_exists($tmp, $param)) {
$str2 .= $param[$tmp];
} else {
$str2 .= $tmp;
}
}
eval("\$str = $str2;");
printf('%5.2d', $str);
/*End of php*/
/**
* math_rpn
*
* 实现逆波兰式算法
*
* @author sparkHuang 260558820@qq.com
* @version RPN 1.0.0
*
*/
class math_rpn {
//初始的计算表达式
private $_expression = '';
//处理后的逆波兰表达式
private $_rpnexp = array();
//模拟栈结构的数组
private $_stack = array('#');
//正则判断
//private $_reg = '/^([A-Za-z0-9\(\)\+\-\*\/])*$/';
//优先级
private $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30);
//四则运算
private $_operator = array('(', '+', '-', '*', '/', ')');
public function __construct($expression) {
$this->_init($expression);
}
private function _init($expression) {
$this->_expression = $expression;
}
public function exp2rpn() {
$len = strlen($this->_expression);
for($i = 0; $i < $len; $i++) {
$char = substr($this->_expression, $i, 1);
if ($char == '(') {
$this->_stack[] = $char;
continue;
} else if ( ! in_array($char, $this->_operator)) {
$this->_rpnexp[] = $char;
continue;
} else if ($char == ')') {
for($j = count($this->_stack); $j >= 0; $j--) {
$tmp = array_pop($this->_stack);
if ($tmp == "(") {
break;
} else {
$this->_rpnexp[] = $tmp;
}
}
continue;
} else if ($this->_priority[$char] <= $this->_priority[end($this->_stack)]) {
$this->_rpnexp[] = array_pop($this->_stack);
$this->_stack[] = $char;
continue;
} else {
$this->_stack[] = $char;
continue;
}
}
for($i = count($this->_stack); $i >= 0; $i--) {
if (end($this->_stack) == '#') break;
$this->_rpnexp[] = array_pop($this->_stack);
}
return $this->_rpnexp;
}
}
$expression = "(A*(B+C)-E+F)*G";
var_dump($expression);
$mathrpn = new math_rpn($expression);
var_dump($mathrpn->exp2rpn());
/*End of php*/
php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用相关推荐
- NPI (Neural Program Interpreter) 逆波兰表达式--什么是逆波兰表达式
打算详细的写一下NPI, 感觉这个蛮帅的.第一篇就先介绍一下要解决的问题了. 中置表达式与逆波兰 "先算乘除,再算加减,最先算括号",这是数学老师告诉我们的用来解决表达式的口诀,可 ...
- 逆波兰表达式简单介绍
逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...
- 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6
括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...
- 7-323 逆波兰表达式 (10 分)
7-323 逆波兰表达式 (10 分) 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改 ...
- 前缀表达式后缀表达式_你知道波兰表达式和逆波兰表达式吗
什么是波兰表达式 我们日常的运算表达式通常是如下形式,这种成为中缀表达式,也就是运算符在运算数的中间.这种表达式人类很容易识别,并根据其进行计算,但计算机识别这种表达式非常困难. a + b * (c ...
- Bailian2694 逆波兰表达式(POJ NOI0202-1696, POJ NOI0303-1696)【文本】
问题链接:POJ NOI0202-1696 逆波兰表达式. 问题链接:POJ NOI0303-1696 逆波兰表达式. 逆波兰表达式 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式 ...
- 1198:逆波兰表达式
1198:逆波兰表达式 <这里应该是波兰表达式(前缀表达式),而逆波兰指的是后缀表达式> 时间限制: 1000 ms 内存限制: 65536 KB [题目描述] 逆波 ...
- 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...
- 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)
文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...
最新文章
- 日期Date和字符串之间转换
- 盘点几种MySQL复制的解决方案和常见的错误理解
- [JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式
- 关于oracle date类型值0000-0-0的分析
- 【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)
- 店招模块终于可以进行后台换图片了
- 坑爹!千万不要在生产环境使用控制台日志
- Sublime Text 2 VS Vim
- 织梦服务器系统win10,WIN服务器爆破DEDECMS后台目录
- java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...
- 互联网日报 | 7月15日 星期四 | B站赠送所有用户1天大会员;饿了么投入3亿用于今夏骑手保障;小米智能工厂二期开工...
- JAVA的项目文件夹_Java中Project项目文件夹的绝对路径
- [除草]BZOJ 1435 [ZJOI2009]多米诺骨牌
- sql2003安装sql2005企业版
- python制作二维码生成器3.0
- Reflection 反射
- 记录一下学习嵌入式的方法和小窍门
- 颜色类中英文词汇大全(3)
- 使用jasypt加密解密
- 地理信息系统(GIS)的前沿技术综述
热门文章
- 移动apn接入点哪个快_51物联卡:使用物联网卡时为什么总要让你设置APN?
- 分析Ajax爬取今日头条街拍图片
- 软件测试岗位英文自我介绍,软件测试工程师自我介绍_工程师英文自我介绍范文...
- android adb命令唤醒屏幕,如何使用adb命令打开和关闭屏幕?
- windows域名解析服务器地址,Win10打开提示无法解析服务器DNS如何解决
- 问题记录 -- 未定义的引用 ||| not found
- 小程序的横向二级顶部导航条,可以切换、拖动、二级定位在一级的下面,高度怎么办
- 神经网络特征层可视化pytorch
- CocoaPods深入一点
- python如何开发网站_如何用Python写一个小网站?