用逆波兰计算工资的PHP方法
一般的中等阶表达式转化为逆波兰表达式的一般算法是:
我们需要分配2层作为临时存储运算符栈S1(包括结束,一个符号)作为输入的逆波兰式栈S2(空栈),S1栈可以放在最低优先级的操作符#,注意,这应该是最低的优先级中缀操作符结束。您可以指定其他角色,不一定#没有。从中缀左提取特征,以通过以下步骤:
(1)如果提取的字符是操作数,则对完整的操作数进行分析。操作数直接发送到S2堆栈。如果操作员被取出,S1堆栈的顶部是,当前操作符直接进入S1堆栈。
(2)如果字符不在运算符、运算符和S1堆栈堆栈元素中,如果运算符优先于堆栈堆栈运算符优先权,则堆栈堆栈中的S1堆栈中的运算符或S1会弹出到S2堆栈中,直到S1堆栈。低于顶级运算符(不包括等于)运算符优先级,运算符进入S1堆栈。
(3)如果字符被选中,它将直接发送到S1堆栈的顶部。
(4)如果提取的字符是),最接近S1堆栈顶部的操作符依次被发送到S2堆栈,然后在此时被丢弃。
(5)重复上面的1~4步,直到所有输入字符完成为止。
(6)如果字符被删除#,那么所有的S1运算符栈(不包括#),一个一个出栈,变成S2栈。
为了完成上述步骤,S2堆栈是波兰输出的逆,但是S2应该做一个逆序,可以根据逆波兰类型的计算方法来计算。
的math_rpn.php文件如下:
< PHP
* math_rpn
*
*逆波兰算法的实现
*
* /
类math_rpn {
初始计算公式
私人_expression美元=;
治疗后的抗波兰处方
私人_rpnexp美元=阵();
数组堆栈结构的模拟
私人_stack美元=阵列(' #);
/普通法官
/ /私人_reg美元({就 = / ^() * + / } * $ );
优先级
私人_priority美元=阵列(' #= > 0,'(' = >+= > 10, 20, 20''=>*、=>30,>30);
四操作
私人_operator美元=阵列('(',' + ',' ',' ','或',')');
公共功能__construct($表达式){
美元-> _init($表达);
}
私有函数_init($表达式){
美元-> _expression = $表达;
}
公共功能exp2rpn(){
$ len = strlen(美元-> _expression);
($ i = 0;$ i;
$字符= substr(美元-> _expression,我,1);
如果($ ={({))
美元-> _stack { } = $字符;
继续;
否则如果(!in_array($字符,美元-> _operator)){
美元-> _rpnexp { } = $字符;
继续;
}($ char = if){
为(J =计数(美元-> _stack);J > = 0;J—){
TMP = array_pop美元(美元-> _stack);
如果($ = )( {)
打破;
{人}
美元-> _rpnexp { } = $ TMP;
}
}
继续;
} else if($这-> _priority {字符} {结束_priority美元(美元-> _stack)}){
美元-> _rpnexp { } = array_pop(美元-> _stack);
美元-> _stack { } = $字符;
继续;
{人}
美元-> _stack { } = $字符;
继续;
}
}
(我=计数为美元(美元-> _stack);$我> = 0;$我--){
如果(结束(美元-> _stack)=打破#);
美元-> _rpnexp { } = array_pop(美元-> _stack);
}
返回_rpnexp美元->;
}
}
测试用例
表达式$ (*(b + C)- E + F);
var_dump($表达);
mathrpn =新math_rpn美元(美元的表达);
var_dump($ mathrpn -> exp2rpn());
* PHP结束/
希望本文能对大家的PHP程序设计有所帮助。