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 相关文章推荐
数字转英文
Dec 06 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
May 07 PHP
php学习笔记 php中面向对象三大特性之一[封装性]的应用
Jun 13 PHP
鸡肋的PHP单例模式应用详解
Jun 03 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
php blowfish加密解密算法
Jul 02 PHP
php实现在新浪云中使用imagick生成缩略图并上传的方法
Sep 26 PHP
php工具型代码之印章抠图
Jul 18 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/10/09 PHP
php 代码优化之经典示例
2011/03/24 PHP
Session保存到数据库的php类分享
2011/10/24 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
php生成zip文件类实例
2015/04/07 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
PHP模糊查询的实现方法(推荐)
2016/09/06 PHP
PHP页面输出搜索后跳转下一页的处理方法
2016/09/30 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
在vs2010中调试javascript代码方法
2011/02/11 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
详解Angular的内置过滤器和自定义过滤器【推荐】
2016/12/26 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
vue打包的时候自动将px转成rem的操作方法
2018/06/20 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
《月迹》教学反思
2014/02/19 职场文书
金融学专业大学生职业生涯规划
2014/03/07 职场文书
主要负责人任命书
2014/06/06 职场文书
中层干部培训方案
2014/06/16 职场文书
通知书大全
2015/04/27 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
这样写python注释让代码更加的优雅
2021/06/02 Python
MySQL中varchar和char类型的区别
2021/11/17 MySQL