首页 > 编程 > PHP > 正文

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

2020-03-22 20:12:45
字体:
来源:转载
供稿:网友
  • 百度谷歌搜索无果,之好自己造一次轮子。

    function rpn2html' target='_blank'>value($str){    $arr = explode(',',$str);    $stack = array();    $len = count($arr);    for($i=0;$i<$len;$i++){        if(is_numeric($arr[$i])){            array_push($stack,$arr[$i]);        }else{            $op = $arr[$i];            $right = array_pop($stack);            $left = array_pop($stack);            eval("/$re = $left $op $right;");            array_push($stack,$re);        }       }    return $stack[0];}

    使用方法:

    $str = "1,2,3,+,*,4,-,5,+,7,*";echo rpn2value($str);

    另附中序转后序代码,版权归原作者所有


    /** * math_rpn * * 实现逆波兰式算法 * * @author   sparkHuang 260558820@qq.com * @version  RPN 1.0.0 * */class math_rpn {    //初始的计算表达式    private $_expression = '';    //处理后的逆波兰表达式    private $_rpnexp = array();    //模拟栈结构的数组 www.it165.net    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());

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表