逆波蘭運算式計算
最近在整理資料時發現了一些以前收藏的有趣代碼
計劃逐步將他們移植到 PHP 供有興趣的人蔘考
PHP code
/** * 逆波蘭運算式計算 * 中綴轉尾碼 **/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; }}
測試例
PHP code
echo postfix( '(2+3)*(3+4)' ); //out 35
------解決方案--------------------
先回貼在看
------解決方案--------------------
這個好東西。
------解決方案--------------------
前排佔座, 板主老大給力.
------解決方案--------------------
前排佔座, 板主老大給力.