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动态创建Flash动画
Oct 09 PHP
IIS6的PHP最佳配置方法
Mar 19 PHP
php中用socket模拟http中post或者get提交数据的示例代码
Aug 08 PHP
php分页代码学习示例分享
Feb 20 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
May 27 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
php简单复制文件的方法
May 09 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
Oct 14 PHP
Paypal实现循环扣款(订阅)功能
Mar 23 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
Nov 10 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
YII2框架中日志的配置与使用方法实例分析
Mar 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
建立动态的WML站点(一)
2006/10/09 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
JS中递归函数
2016/06/17 Javascript
Javascript实现倒计时(防页面刷新)实例
2016/12/13 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
vue.js element-ui validate中代码不执行问题解决方法
2017/12/18 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
js实现录音上传功能
2019/11/22 Javascript
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Python+tkinter使用80行代码实现一个计算器实例
2018/01/16 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
python合并多个excel文件的示例
2020/09/23 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
html5定制表单_动力节点Java学院整理
2017/07/11 HTML / CSS
耐克中国官方商城:Nike中国
2018/10/18 全球购物
Lacoste(法国鳄鱼)加拿大官网:以标志性的POLO衫而闻名
2019/05/15 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
北京银河万佳Java面试题
2012/03/21 面试题
北京大学自荐信范文
2014/01/28 职场文书
党校个人自我鉴定范文
2014/03/28 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
SpringRetry重试框架的具体使用
2021/07/25 Java/Android
TV动画《间谍过家家》公开PV
2022/03/20 日漫