ホームページ >バックエンド開発 >PHPチュートリアル >操車場アルゴリズムを使用して PHP で電卓を構築するにはどうすればよいですか?

操車場アルゴリズムを使用して PHP で電卓を構築するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-11 06:22:11119ブラウズ

How to Build a Calculator in PHP Using the Shunting Yard Algorithm?

PHP で電卓を作成するには?

PHP で電卓を作成するには、ユーザーが入力した数式を解析して評価する必要があります。これには、ユーザー入力の処理と数学的演算の適用が含まれるため、難しい場合があります。

操車場アルゴリズムの利用

推奨されるアプローチの 1 つは、操車場アルゴリズムを活用することです。このアルゴリズムは、数式を評価しやすい逆ポーランド記法 (RPN) に変換します。

実装例

操車場アルゴリズムを使用した簡略化された例を次に示します。

// Terminal expression abstract class
abstract class TerminalExpression {

    public function operate() {
        return $this->value;
    }

    public function isOperator() {
        return false;
    }

    public function isParenthesis() {
        return false;
    }

    public function isNoOp() {
        return false;
    }
}

// Operator expression abstract class
abstract class Operator extends TerminalExpression {

    public function isOperator() {
        return true;
    }
}

// Stack implementation
class Stack {

    private $data = [];

    public function push($element) {
        $this->data[] = $element;
    }

    public function peek() {
        return end($this->data);
    }

    public function pop() {
        return array_pop($this->data);
    }
}

// Math class for evaluation
class Math {

    public function evaluate($expression) {
        $stack = $this->parse($expression);
        return $this->run($stack);
    }

    private function parse($expression) {
        $tokens = $this->tokenize($expression);
        $output = new Stack();
        $operators = new Stack();

        foreach ($tokens as $token) {
            $type = TerminalExpression::factory($token);

            if ($type->isOperator()) {
                $this->parseOperator($type, $output, $operators);
            } elseif ($type->isParenthesis()) {
                $this->parseParenthesis($type, $output, $operators);
            } else {
                $output->push($type);
            }
        }

        while (($op = $operators->pop())) {
            if ($op->isParenthesis()) {
                throw new RuntimeException('Mismatched Parenthesis');
            }
            $output->push($op);
        }

        return $output;
    }

    private function run(Stack $stack) {
        while (($operator = $stack->pop()) && $operator->isOperator()) {
            $value = $operator->operate($stack);
            if ($value !== null) {
                $stack->push(TerminalExpression::factory($value));
            }
        }
        return $operator ? $operator->render() : $this->render($stack);
    }

    protected function tokenize($string) {
        return preg_split('((\d+|\+|-|\(|\)|\*|/)|\s+)', $string, null, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    }
}

$math = new Math();
$answer = $math->evaluate('(2 + 3) * 4');
var_dump($answer); // int(20)

この例では、操車場アルゴリズムを使用して単純な数学的アルゴリズムを解析および評価する方法を示します。表現。

以上が操車場アルゴリズムを使用して PHP で電卓を構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。