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 相关文章推荐
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
Godaddy空间Zend Optimizer升级方法
May 10 PHP
PHP新手入门学习方法
May 08 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
Sep 29 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
利用Fix Rss Feeds插件修复WordPress的Feed显示错误
Dec 19 PHP
浅谈PHP中其他类型转化为Bool类型
Mar 28 PHP
深入理解PHP中的empty和isset函数
May 26 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 PHP
mysqli扩展无法在PHP7下升级问题的解决
Sep 10 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 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
PHP通用检测函数集合
2006/11/25 PHP
PHP防止跨域提交表单
2013/11/01 PHP
PHP中redis的用法深入解析
2014/02/20 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
2014/09/02 PHP
Laravel 5框架学习之Eloquent 关系
2015/04/09 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
Jquery chosen动态设置值实例介绍
2013/08/08 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
初始Nodejs
2014/11/08 NodeJs
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
JS实现按钮添加背景音乐示例代码
2017/10/17 Javascript
深入解析ES6中的promise
2018/11/08 Javascript
Vue表单控件绑定图文详解
2019/02/11 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
2019/08/09 Python
python面向对象 反射原理解析
2019/08/12 Python
Pycharm 字体大小调整设置的方法实现
2019/09/27 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
酒店总经理工作职责
2013/12/13 职场文书
党课学习思想汇报
2014/01/02 职场文书
我的小天地教学反思
2014/04/30 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
MySQL8.0 Undo Tablespace管理详解
2022/06/16 MySQL