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调用数据库的存贮过程
Oct 09 PHP
Smarty+QUICKFORM小小演示
Feb 25 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
PHP+jquery+ajax实现即时聊天功能实例
Dec 23 PHP
Smarty变量用法详解
May 11 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
详解PHP数据压缩、加解密(pack, unpack)
Dec 17 PHP
php使用PDO获取结果集的方法
Feb 16 PHP
php获取今日开始时间和结束时间的方法
Feb 27 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 PHP
ThinkPHP5.1+Ajax实现的无刷新分页功能示例
Feb 10 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读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
PHP中overload与override的区别
2017/02/13 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
用CSS+JS实现的进度条效果效果
2007/06/05 Javascript
JSON 客户端和服务器端的格式转换
2009/08/27 Javascript
JavaScript DOM学习第六章 表单实例
2010/02/19 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
2013/10/14 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
jquery实现的代替传统checkbox样式插件
2015/06/19 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
2017/04/23 Javascript
深入理解Vue transition源码分析
2017/07/30 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
Node.js中的cluster模块深入解读
2018/06/11 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
详解webpack 热更新优化
2018/09/13 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
python boto和boto3操作bucket的示例
2020/10/30 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
全球最大运动品牌的男装、女装和童装官方库存商:A&A Sports
2021/01/17 全球购物
实习期自我鉴定
2013/10/11 职场文书
公司活动邀请函
2014/01/24 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书