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 xfocus防注入资料
Apr 27 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
Oct 29 PHP
PHP实现根据设备类型自动跳转相应页面的方法
Jul 24 PHP
PHP中unset,array_splice删除数组中元素的区别
Jul 28 PHP
yii2控制器Controller Ajax操作示例
Jul 23 PHP
常用PHP封装分页工具类
Jan 14 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 PHP
PHP7 windows支持
Mar 09 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
ftp类(myftp.php)
2006/10/09 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
Thinkphp 框架扩展之驱动扩展实例分析
2020/04/27 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
WebView启动支付宝客户端支付失败的问题小结
2017/01/11 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
微信小程序实现带缩略图轮播效果
2018/11/04 Javascript
python元组操作实例解析
2014/09/23 Python
Python简明入门教程
2015/08/04 Python
Python单例模式的两种实现方法
2017/08/14 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
python3实现名片管理系统
2020/11/29 Python
Python秒算24点实现及原理详解
2019/07/29 Python
python爬取微博评论的实例讲解
2021/01/15 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
可能这些是你想要的H5软键盘兼容方案(小结)
2019/04/23 HTML / CSS
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
入党申请人的自我鉴定
2013/12/01 职场文书
售后专员岗位职责
2013/12/08 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
春风化雨观后感
2015/06/11 职场文书
护士医德医风心得体会
2016/01/25 职场文书
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang