`
ling凌yue月
  • 浏览: 334593 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

表达式求值

 
阅读更多

 

 

//后缀表达式求值
function calculate($equation = ''){
    if(empty($equation)){
        return 0;
    }
    //声明各个符号的算法函数
    $operations = array('+' => function($param1, $param2){
        return $param1 + $param2;
    }, '-' => function($param1, $param2){
        return $param1 - $param2;
    }, '*' => function($param1, $param2){
        return $param1 * $param2;
    }, '/' => function($param1, $param2){
        return $param1 / $param2;
    });
    //将表达式用空格分隔为数组
    $equationArr = explode(' ', $equation);
    $numStack = array();
    $result = 0;
    //循环数组
    foreach($equationArr as $c){
        //如果是符号
        if(in_array($c, array_keys($operations))){
            $param1 = (int)array_pop($numStack);
            $param2 = (int)array_pop($numStack);
            $subEquation = $operations[$c]($param2, $param1);
            array_push($numStack, $subEquation);
        //如果是数字,将本数入栈
        }else{
            array_push($numStack, intval($c));
        }
    }
    return array_pop($numStack);
}

$result = calculate('2 3 5 7 + - *');
var_dump($result);

 

 

//( ( 1 + 2 ) * 3 ) * 3 + 4 / 2
//转换中缀表达式为后缀表达式
function infixToPosfixNotation($equation = ''){
    if(empty($equation)){
		return false;
	}
    $operations = array('+' => array('p' => 1), '-' => array('p' => 1), '*' => array('p' => 3)
    , '/' => array('p' => 2),'(' => array('p' =>0), ')' => array('p' => 0),
    );
    $numStack = array();
    $operStack = array();
    $equationArr = explode(' ', $equation);
    foreach($equationArr as $c){
        //将优先级高的操作符放到操作符栈顶
        if(in_array($c, array_keys($operations))){
			//如果操作符栈为空
            switch($c){
            case '(':
                array_push($operStack, $c);
                break;
            case ')':
				//如果是右括号
                while(($popOper = end($operStack)) && $popOper != '('){
                    array_push($numStack, array_pop($operStack));
                }
                //去除左括号
                array_pop($operStack);
                break;
            default:
                $popOper = end($operStack);
                while(($popOper = end($operStack)) && $popOper != '(' && $operations[$popOper]['p'] > $operations[$c]['p']){
                    array_push($numStack, array_pop($operStack));
                }//压入符号栈
                array_push($operStack, $c);
                break;
            }         	   
    	}else{
            array_push($numStack, intval($c));
		}
	}
    while($popOper = array_pop($operStack)){
        array_push($numStack, $popOper);
    }
    return implode(' ', $numStack);
}

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics