逆ポーランド式の計算、解き方

WBOY
リリース: 2016-06-13 13:52:08
オリジナル
660 人が閲覧しました

逆ポーランド式計算
最近資料を整理していたら以前集めていた面白いコードを発見しました
興味のある方の参考に少しずつPHPに移植していく予定です

PHPコード
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->/**
 * 逆波兰表达式计算
 * 中缀转后缀
 **/
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 highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->echo postfix( '(2+3)*(3+4)' ); //out 35
ログイン後にコピー


-----解決策----- --- -
最初に投稿して後で見てください
------解決策------------------
これは良いことだ。

------解決策------------------
最前列に座ってください、ボスは素晴らしいです。
------解決策------------------
最前列の席を確保してください。司会者は素晴らしいです。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!