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与javascript对多项选择的处理
Oct 09 PHP
dedecms防止FCK乱格式化你的代码的修改方法
Mar 17 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
Oct 05 PHP
PHP批量生成静态HTML的简单原理和方法
Apr 20 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
PHP简单处理表单输入的特殊字符的方法
Feb 03 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
php生成图片验证码的方法
Apr 15 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
Windows服务器中PHP如何安装redis扩展
Sep 27 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/12/06 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
php实现的日历程序
2015/06/18 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
javascript indexOf函数使用说明
2008/07/03 Javascript
Mootools 1.2教程(3) 数组使用简介
2009/09/14 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
jquery实现文本框的禁用和启用
2016/12/07 Javascript
详解Vuex管理登录状态
2017/11/13 Javascript
基于Vue的延迟加载插件vue-view-lazy
2018/05/21 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
Python导出DBF文件到Excel的方法
2015/07/25 Python
使用python生成目录树
2018/03/29 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
python的几种矩阵相乘的公式详解
2019/07/10 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
客服工作职责
2013/12/11 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
消夏晚会主持词
2015/06/30 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
《打电话》教学反思
2016/02/22 职场文书
物业管理交接协议书
2016/03/24 职场文书
创业计划书之美容店
2019/09/16 职场文书
R9700摩机记
2022/04/05 无线电
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
Ubuntu Server 安装Tomcat并配置systemctl
2022/04/28 Servers
Android studio 简单计算器的编写
2022/05/20 Java/Android