البحث عن الإجابة على المعادلة سلسلة دون استخدام وحدة التقييم ()

StackOverflow https://stackoverflow.com/questions/1804249

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا بحاجة إلى وسيلة لأخذ معادلة معينة كسلسلة وإيجاد انها الجواب الرياضية، والتحذير الكبير هو أنني لا يمكن استخدام وحدة التقييم ().

وأنا أعلم أن المعادلة تحتوي فقط من أي وقت مضى الأرقام والعمليات الحسابية الأربع (أي * / + -) والأقواس، قد أو قد لا يكون مسافات في السلسلة. وهنا بضعة أمثلة.

4 * 4
4+6/3
(3 / 2)*(4+8)
(4+8) * 2

وانا التخمين أنه ستكون لدينا إلى أن يتم ذلك مع نوع من التعابير المنطقية؟

هل كانت مفيدة؟

المحلول

وتعبيرات الرياضيات ليست منتظمة. انهم خالية من السياق .

وأفضل رهان هو تحليل لهم باستخدام معروفة خوارزميات تحليل الرياضيات مثل في السحب ساحة خوارزمية . كل ما عليك ما يدعو للقلق على تنفيذ الخوارزمية في PHP. حتى أنك قد تكون قادرة على العثور على تطبيقات PHP من على الإنترنت.

نصائح أخرى

وفقط في حالة أي شخص مهتم هنا هو خوارزمية خطرت لي في PHP لإنتاج عكسي البولندية تدوين

function convertToRPN($equation)

{
    $equation = str_replace(' ', '', $equation);
    $tokens = token_get_all('<?php ' . $equation);
    $operators = array('*' => 1, '/' => 1, '+' => 2, '-' => 2);
    $rpn = '';
    $stack = array();
    $size = count($tokens);                                                 
    for($i = 1; $i < $size; $i++) {
        if(is_array($tokens[$i])) {
            $rpn .= $tokens[$i][1] . ' ';
        } else {
            if(empty($stack) || $tokens[$i] == '(') {
                $stack[] = $tokens[$i];
            } else {
                if($tokens[$i] == ')') {
                    while(end($stack) != '(') {
                        $rpn .= array_pop($stack);
                    }
                    array_pop($stack);
                } else {
                    while(!empty($stack) && end($stack) != '(' && $operators[$tokens[$i]] >= $operators[end($stack)]) {
                        $rpn .= array_pop($stack);
                    }
                    $stack[] = $tokens[$i];
                }
            }
        }
    }

    while(!empty($stack)) {
        $rpn .= array_pop($stack);
    }

    return $rpn;
}
scroll top