表达式求值

 

 

//后缀表达式求值
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);
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值