PHP使用逆波兰式计算工资的方法


Posted in PHP onJuly 29, 2015

本文实例讲述了PHP使用逆波兰式计算工资的方法。分享给大家供大家参考。具体如下:

将一个普通的中序表达式转换为逆波兰表达式的一般算法是:

首先需要分配2个栈,一个作为临时存储运算符的栈S1(含一个结束符号),一个作为输入逆波兰 式的栈S2(空栈),S1栈可先放入优先级最低的运算符#,注意,中缀式应以此最低优先级的运算符结束。可指定其他字符,不一定非#不可。从中缀式的左端 开始取字符,逐序进行如下步骤:

(1)若取出的字符是操作数,则分析出完整的运算数,该操作数直接送入S2栈;若取出的是运算符,并且当前S1栈顶为(,则当前运算符直接入S1栈。

(2)若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否者,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。

(3)若取出的字符是“(”,则直接送入S1栈栈顶。

(4)若取出的字符是“)”,则将距离S1栈栈顶最近的“(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”。

(5)重复上面的1~4步,直至处理完所有的输入字符

(6)若取出的字符是“#”,则将S1栈内所有运算符(不包括“#”),逐个出栈,依次送入S2栈。

完成以上步骤,S2栈便为逆波兰式输出结果。不过S2应做一下逆序处理。便可以按照逆波兰式的计算方法计算了!

math_rpn.php文件如下:

<?php
/**
 * math_rpn 
 *
 * 实现逆波兰式算法
 *  
 */
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 相关文章推荐
杏林同学录(八)
Oct 09 PHP
PHP程序员编程注意事项
Apr 10 PHP
php小偷相关截取函数备忘
Nov 28 PHP
php中session退出登陆问题
Feb 27 PHP
PHP实现简单汉字验证码
Jul 28 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
php生成gif动画的方法
Nov 05 PHP
微信红包随机生成算法php版
Jul 21 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
Laravel 实现数据软删除功能
Aug 21 PHP
ThinkPHP实现递归无级分类――代码少
Jul 29 #PHP
PHP之正则表达式捕获组与非捕获组(详解)
Jul 29 #PHP
PHP实现的简单缓存类
Jul 29 #PHP
PHP实现简单爬虫的方法
Jul 29 #PHP
php获取网站百度快照日期的方法
Jul 29 #PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 #PHP
PHP如何实现Unicode和Utf-8编码相互转换
Jul 29 #PHP
You might like
js 获取服务器控件值的代码
2010/03/05 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
2019/05/21 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
深度剖析使用python抓取网页正文的源码
2014/06/11 Python
Python numpy 常用函数总结
2017/12/07 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
tensorflow TFRecords文件的生成和读取的方法
2018/02/06 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
django富文本编辑器的实现示例
2019/04/10 Python
Django 模型类(models.py)的定义详解
2019/07/19 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
基于FME使用Python过程图解
2020/05/13 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
python如何设置静态变量
2020/09/07 Python
大专计算机个人求职的自我评价
2013/10/21 职场文书
业务主管岗位职责
2013/11/20 职场文书
个性大学生自我评价
2013/12/04 职场文书
普通大学毕业生自荐信范文
2014/02/23 职场文书
教师师德承诺书
2014/03/26 职场文书
党的群众路线学习材料
2014/05/16 职场文书
公司授权委托书范本
2014/09/18 职场文书
遗嘱格式范本
2015/08/07 职场文书
心理学培训心得体会
2016/01/22 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server