Eval kullanmadan dize denkleme cevabı bulun ()

2 Cevap php

Ben bir dize olarak verilen bir denklemi alarak ve matematiksel bir cevap bulmak için bir yol gerekir, büyük uyarı I eval () kullanamazsınız olmasıdır.

(Yani * / + -) Ben denklemi sadece hiç sayı, dört matematiksel operatörler içeren biliyorum ve parantez, o ya da dize boşluk olabilir veya olmayabilir. İşte bir kaç örnek var.

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

Ben regex bazı tür yapılabilir zorunda olacak tahmin ediyorum?

2 Cevap

Matematik ifadeler düzenli değildir. Onlar context-free.

Yapabileceğiniz en iyi şey the shunting yard algorithm gibi ünlü matematik çözümleme algoritmaları kullanarak ayrıştırmak için. Hakkında endişelenmenize gerek tüm PHP algoritması uygulamaktadır. Hatta online bunun PHP uygulamalarını bulmak mümkün olabilir.

Sadece durumda herkes ben Ters Polonya Notation'ý üretmek için PHP ile geldi algoritma burada ilgilenen mi

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;
}