没想到啊

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

http://www.oschina.net/code/snippet_167160_6512

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



posted on 2011-11-07 10:27  没想到啊  阅读(332)  评论(0)    收藏  举报