Heim >php教程 >php手册 >PHP计算后序表达式(逆波兰式)

PHP计算后序表达式(逆波兰式)

WBOY
WBOYOriginal
2016-06-06 20:08:271046Durchsuche

百度谷歌搜索无果,只好自己造一次轮子。 PHP /** * rpn2value * 计算逆波兰式 * @author leo108 root@leo108.com */function rpn2value($str){ $arr = explode(',',$str); $stack = array(); $len = count($arr); for($i=0;$i$len;$i++){ if(is_numeric($ar

百度谷歌搜索无果,只好自己造一次轮子。 PHP

/**
 * rpn2value
 * 计算逆波兰式
 * @author   leo108 root@leo108.com
 */
function rpn2value($str){
    $arr = explode(',',$str);
    $stack = array();
    $len = count($arr);
    for($i=0;$i
<p>使用方法: </p><p class="Uhb784">逆波兰式</p> 
<pre class="brush:php;toolbar:false">$str = "1,2,3,+,*,4,-,5,+,7,*";
echo rpn2value($str);

另附中序转后序代码,版权归原作者所有 http://leo108.com/pid-1901.asp

/**
 * 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 _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] _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());

 

中序表达式

Stellungnahme:
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
Vorheriger Artikel:PHP exec mysql return emptyNächster Artikel:Function.php版本的Comment Ajax