Home > php教程 > PHP源码 > PHP实现逆波兰式 - 计算工资时用

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

PHP中文网
Release: 2016-05-25 17:13:08
Original
1065 people have browsed it

php代码

<?php
/**
 * math_rpn 
 *
 * 实现逆波兰式算法
 *   
 * @author   sparkHuang 260558820@qq.com
 * @version  RPN 1.0.0 
 * 
 */

class math_rpn {
	//初始的计算表达式
	private $_expression = &#39;&#39;;
	//处理后的逆波兰表达式
	private $_rpnexp = array();
	
	//模拟栈结构的数组
	private $_stack  = array(&#39;#&#39;);
	
	//正则判断
	//private $_reg    = &#39;/^([A-Za-z0-9\(\)\+\-\*\/])*$/&#39;;
	
	//优先级
	private $_priority = array(&#39;#&#39; => 0, &#39;(&#39; => 10, &#39;+&#39; => 20, &#39;-&#39; => 20, &#39;*&#39; => 30, &#39;/&#39; => 30);
	
	//四则运算
	private $_operator = array(&#39;(&#39;, &#39;+&#39;, &#39;-&#39;, &#39;*&#39;, &#39;/&#39;, &#39;)&#39;);
	
	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 == &#39;(&#39;) {
				$this->_stack[] = $char;
				continue;
			} else if ( ! in_array($char, $this->_operator)) {
				$this->_rpnexp[] = $char;
				continue;
			} else if ($char == &#39;)&#39;) {
				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) == &#39;#&#39;) 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*/
Copy after login
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template