近期一个小项目需要用到公式运算, 所以就进行一些了解,以下内容均属于个人经验。

在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实现逆波兰式 - 计算工资时用相关推荐

  1. NPI (Neural Program Interpreter) 逆波兰表达式--什么是逆波兰表达式

    打算详细的写一下NPI, 感觉这个蛮帅的.第一篇就先介绍一下要解决的问题了. 中置表达式与逆波兰 "先算乘除,再算加减,最先算括号",这是数学老师告诉我们的用来解决表达式的口诀,可 ...

  2. 逆波兰表达式简单介绍

    逆波兰表达式又叫做后缀表达式.在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,所以,这种表示法也称为中缀表示.波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的 ...

  3. 数据结构链表之栈——解决括号匹配问题和逆波兰表达式求值问题——6

    括号匹配问题和逆波兰表达式求值问题 基于上一节已经使用python代码对栈进行了简单的实现,这一节我们在其基础上解决两个常见的问题 案例 括号匹配问题(点我直接到代码实现) 逆波兰表达式求值问题(点我 ...

  4. 7-323 逆波兰表达式 (10 分)

    7-323 逆波兰表达式 (10 分) 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改 ...

  5. 前缀表达式后缀表达式_你知道波兰表达式和逆波兰表达式吗

    什么是波兰表达式 我们日常的运算表达式通常是如下形式,这种成为中缀表达式,也就是运算符在运算数的中间.这种表达式人类很容易识别,并根据其进行计算,但计算机识别这种表达式非常困难. a + b * (c ...

  6. Bailian2694 逆波兰表达式(POJ NOI0202-1696, POJ NOI0303-1696)【文本】

    问题链接:POJ NOI0202-1696 逆波兰表达式. 问题链接:POJ NOI0303-1696 逆波兰表达式. 逆波兰表达式 描述 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式 ...

  7. 1198:逆波兰表达式

    1198:逆波兰表达式    <这里应该是波兰表达式(前缀表达式),而逆波兰指的是后缀表达式> 时间限制: 1000 ms         内存限制: 65536 KB [题目描述] 逆波 ...

  8. 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

    题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...

  9. 【Leetcode栈与队列】150. 逆波兰表达式求值(后缀表达式求值,看作对对碰游戏)

    文章目录 Leetcode150 1.问题描述 2.解决方案 3.计算机的思考方式 Leetcode150 1.问题描述 2.解决方案 1.逆波兰表达式优点 2.逆波兰表达式相当于是二叉树中的后序遍历 ...

最新文章

  1. 日期Date和字符串之间转换
  2. 盘点几种MySQL复制的解决方案和常见的错误理解
  3. [JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式
  4. 关于oracle date类型值0000-0-0的分析
  5. 【Python1】双系统安装,深度学习环境搭建,目标检测(Tensorflow_API_SSD)
  6. 店招模块终于可以进行后台换图片了
  7. 坑爹!千万不要在生产环境使用控制台日志
  8. Sublime Text 2 VS Vim
  9. 织梦服务器系统win10,WIN服务器爆破DEDECMS后台目录
  10. java多态的两种形式_java核心(八):继承与方法重写、final、多态性的两种描述形式...
  11. 互联网日报 | 7月15日 星期四 | B站赠送所有用户1天大会员;饿了么投入3亿用于今夏骑手保障;小米智能工厂二期开工...
  12. JAVA的项目文件夹_Java中Project项目文件夹的绝对路径
  13. [除草]BZOJ 1435 [ZJOI2009]多米诺骨牌
  14. sql2003安装sql2005企业版
  15. python制作二维码生成器3.0
  16. Reflection 反射
  17. 记录一下学习嵌入式的方法和小窍门
  18. 颜色类中英文词汇大全(3)
  19. 使用jasypt加密解密
  20. 地理信息系统(GIS)的前沿技术综述

热门文章

  1. 移动apn接入点哪个快_51物联卡:使用物联网卡时为什么总要让你设置APN?
  2. 分析Ajax爬取今日头条街拍图片
  3. 软件测试岗位英文自我介绍,软件测试工程师自我介绍_工程师英文自我介绍范文...
  4. android adb命令唤醒屏幕,如何使用adb命令打开和关闭屏幕?
  5. windows域名解析服务器地址,Win10打开提示无法解析服务器DNS如何解决
  6. 问题记录 -- 未定义的引用 ||| not found
  7. 小程序的横向二级顶部导航条,可以切换、拖动、二级定位在一级的下面,高度怎么办
  8. 神经网络特征层可视化pytorch
  9. CocoaPods深入一点
  10. python如何开发网站_如何用Python写一个小网站?