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 和 MYSQL
Oct 09 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
Jun 07 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
通过Email发送PHP错误的方法
Jul 20 PHP
php制作简单模版引擎
Apr 07 PHP
php实现跨域提交form表单的方法【2种方法】
Oct 17 PHP
详解php中 === 的使用
Oct 24 PHP
thinkPHP线上自动加载异常与修复方法实例分析
Dec 01 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
Nov 06 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
Feb 15 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 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
FormValidate 表单验证功能代码更新并提供下载
2008/08/23 Javascript
判断脚本加载是否完成的方法
2009/05/26 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
js实现window.open不被拦截的解决方法汇总
2014/10/30 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
JavaScript中localStorage对象存储方式实例分析
2017/01/12 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
Python 随机生成中文验证码的实例代码
2013/03/20 Python
python实现的文件同步服务器实例
2015/06/02 Python
如何使用python把ppt转换成pdf
2019/06/29 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
2020/04/10 Python
python实现扑克牌交互式界面发牌程序
2020/04/22 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
软件测试常见笔试题
2012/02/04 面试题
计算机专业推荐信范文
2013/11/27 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
2014年3.15团委活动总结
2014/03/16 职场文书
幼儿园儿童节主持词
2014/03/21 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
演讲稿:态度决定一切
2019/04/02 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js