欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

PHP实现逆波兰式 - 计算工资时用

程序员文章站 2022-06-02 13:58:45
...
php代码
<?php
/**
 * math_rpn 
 *
 * 实现逆波兰式算法
 *   
 * @author   sparkHuang 260558820@qq.com
 * @version  RPN 1.0.0 
 * 
 */

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*/