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 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
优化使用mysql存储session的php代码
Jan 10 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
php header功能的使用
Oct 28 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
php版微信js-sdk支付接口类用法示例
Oct 12 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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
php5 and xml示例
2006/11/22 PHP
php之字符串变相相减的代码
2007/03/19 PHP
php面向对象全攻略 (十七) 自动加载类
2009/09/30 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
Yii2.0高级框架数据库增删改查的一些操作
2015/11/16 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
THREE.JS入门教程(2)着色器-上
2013/01/24 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
Jquery解析Json格式数据过程代码
2014/10/17 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
Vue数据双向绑定原理实例解析
2020/05/15 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
python获取文件后缀名及批量更新目录下文件后缀名的方法
2014/11/11 Python
通过C++学习Python
2015/01/20 Python
numpy向空的二维数组中添加元素的方法
2018/11/01 Python
python计算两个矩形框重合百分比的实例
2018/11/07 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
高品质和独特的产品世界:Creations and Collections
2018/01/07 全球购物
财务管理职业生涯规划范文
2013/12/27 职场文书
医学院校毕业生自荐信范文
2014/01/01 职场文书
工商治理实习生的自我评价
2014/01/15 职场文书
自荐信写法介绍
2014/01/25 职场文书
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers