逆波兰表达式计算
最近在整理资料时发现了一些以前收藏的有趣代码
计划逐步将他们移植到 PHP 供有兴趣的人参考
计划逐步将他们移植到 PHP 供有兴趣的人参考
/**
* 逆波兰表达式计算
* 中缀转后缀
**/
function postfix($infix) {
$priority = array( //算符优先级
'+' => 1, '-' => 1,
'*' => 2, '/' => 2,
'(' => 0, ')' => 0,
'.' => 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0
);
$stack = array(); //符号栈
$data = array(); //数值栈
$i = $top = 0;
$last = -1;
$len = strlen($infix);
while($i<$len) {
switch($infix{$i}) {
case '(':
array_unshift($stack, $infix{$i});
break;
case '+': case '-': case '*': case '/':
if($t != '') array_unshift($data, $t);
$t = '';
while($priority[$stack[0]] >= $priority[$infix{$i}]) {
postfix_callback(array_shift($stack), $data);
}
array_unshift($stack, $infix{$i});
break;
case ')':
if($t != '') array_unshift($data, $t);
$t = '';
while($stack[0] != '(') {
postfix_callback(array_shift($stack), $data);
}
array_shift($stack);
break;
default:
if($i > $last+1 && $t != '') {
array_unshift($data, $t);
$t = '';
}
$t .= $infix{$i};
$last = $i;
break;
}
$i++;
}
while($stack) {
postfix_callback(array_shift($stack), $data);
}
return $data[0];
}
/**
* postfix 的工作函数
* 用于计算表达式的值
**/
function postfix_callback($ch, &$data) {
$b = array_shift($data);
switch($ch) {
case '+':
$data[0] += $b;
break;
case '-':
$data[0] -= $b;
break;
case '*':
$data[0] *= $b;
break;
case '/':
$data[0] /= $b;
break;
}
}
测试例echo postfix( '(2+3)*(3+4)' ); //out 35
...全文
相关推荐
表达式计算 逆波兰式 栈 可括号小数负数
栈作中介,将表达式转化成逆波兰式,然后计算表达式的值。支持括号。允许负数和小数。
基于逆波兰表达式的计算程序
以字符串的形式输入一个算术表达式,转换为逆波兰表达式,并求取其数值。
python实现逆波兰计算表达式实例详解
主要介绍了python实现逆波兰计算表达式的方法,较为详细的分析了逆波兰表达式的概念及实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
基于逆波兰表达式的科学计算机源码
基于逆波兰表达书的科学计算器,完全开源,带源码,可供学习和应用
表达式计算 逆波兰式 栈
栈作中介,将表达式转化成逆波兰式,然后计算表达式的值。。支持括号。。允许负数和小数


