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+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
php Smarty 字符比较代码
Feb 27 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
May 24 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
php中return的用法实例分析
Feb 28 PHP
分享10段PHP常用代码
Nov 11 PHP
php生成带logo二维码方法小结
Apr 08 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
Oct 07 PHP
Laravel框架搜索分页功能示例
Feb 01 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环形链表实现方法示例
2017/09/15 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
javascript之AJAX框架使用说明
2010/04/24 Javascript
获得Javascript对象属性个数的示例代码
2013/11/21 Javascript
js创建元素(节点)示例
2014/01/02 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
JS实现漂亮的时间选择框效果
2016/08/20 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
javascript使用canvas实现饼状图效果
2020/09/08 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Pycharm安装python库的方法
2020/11/24 Python
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
internal修饰符起什么作用
2013/12/16 面试题
材料成型专业个人求职信范文
2013/09/25 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
合作协议书模板
2014/10/10 职场文书
投标邀请书范本
2015/02/02 职场文书
阿甘正传观后感
2015/06/01 职场文书
死亡诗社观后感
2015/06/05 职场文书
2016年五四青年节校园广播稿
2015/12/17 职场文书
求职自荐信该如何书写?
2019/06/24 职场文书
导游词之江南周庄
2019/12/06 职场文书
《雪域豹影》读后感:父爱的伟大
2019/12/23 职场文书
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python