Heim > php教程 > PHP源码 > Hauptteil

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

PHP中文网
Freigeben: 2016-05-25 17:13:08
Original
1038 Leute haben es durchsucht

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*/
Nach dem Login kopieren
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage