龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

四则运算表达式转换为后缀表达式

时间:2014-07-22 14:48来源: 作者: 点击:
分享到:
四则运算表达式(中缀表达式)转换为后缀表达式:如中缀表达式9 + ( 3 - 1 ) * 3 + 10 / 2,对应的后缀表达式是9 3 1 - 3 * + 10 2 / +PS:逻辑实现了,要下班了,代码有些乱,明天再来优化。
四则运算表达式(中缀表达式)转换为后缀表达式:
如中缀表达式9 + ( 3 - 1 ) * 3 + 10 / 2,对应的后缀表达式是9 3 1 - 3 * + 10 2 / +

PS:逻辑实现了,要下班了,代码有些乱,明天再来优化。
<?php
function suffix($str, &$stack, &$newStrList){

    //如果是数字则输出
    if(is_numeric($str)){
        $newStrList .= $str . ' ';
    }
    //如果是左括号则入栈
    else if($str == '('){
        $stack[] = $str;
    }
    //如果是右括号则将最近的左括号之前的所有数据出栈
    else if($str == ')'){
        while($arrPop = array_pop($stack)){
            if($arrPop == '('){
                break;
            }
            $newStrList .= $arrPop . ' ';
        }
    }
    //如果是加减乘除则判断与栈顶符号优先级
    else if(in_array($str, array('+', '-', '*', '/')) && count($stack) > 0){
        $key  = (count($stack) - 1);
        if(in_array($stack[$key], array('+', '-', '*', '/'))){
            if(checkPriority($str, $stack[$key]) != 1){
                for($i=$key; $i>=0; $i--){
                    if($stack[$i] == '('){
                        break;
                    }
                    $newStrList .= $stack[$i] . ' ';
                    unset($stack[$i]);
                    $stack = array_values($stack);
                }
                $stack[] = $str;
            }else{
                $stack[] = $str;
            }
        }else{
            $stack[] = $str;
        }
    }else{
        $stack[] = $str;
    }
}

/**
 * 判断运算符的优先级
 * @param $operatorA
 * @param $operatorB
 * @return A大于B返回1,A等于B返回0,A小于B返回-1
 */
function checkPriority($operatorA, $operatorB){
    switch($operatorA){
        case '+':
        case '-':
            if($operatorB == '+' || $operatorB == '-'){
                return 0;
            }else if($operatorB == '*' || $operatorB == '/'){
                return -1;
            }
            break;
        case '*':
        case '/':
            if($operatorB == '+' || $operatorB == '-'){
                return 1;
            }else if($operatorB == '*' || $operatorB == '/'){
                return 0;
            }
            break;
        default:
            exit('error');
    }
}

$stack = array();
$newStrList = '';
$strList = '9 + ( 3 - 1 ) * 3 + 10 / 2';
$strList = explode(' ', $strList);
foreach($strList as $str){
    if($str == ' '){
        continue;
    }
    suffix($str, $stack, $newStrList);
}
$stack = array_reverse($stack);
foreach($stack as $s){
    $newStrList .= $s . ' ';
}
echo $newStrList;
精彩图集

赞助商链接