Evaluate mathematical expression in PHP
四則運算,不多,不就是加減乘除而已嗎,怎麼會在 Codewars 中被標記為 2 kyu 的題目呢? 總覺得這篇標題應該改為「Codewars 從入坑道棄坑,只需要一題就搞定」。首先我是在 2019 年底才接觸 Codewars,這種打怪練功的感覺讓我一下就上癮了,每天都在想今天能不能再拚一階,或是這題用另外一個語言會不會比較省時間。直到遇到了這題,足足卡了一整天。下面就來介紹一下四則運算在 PHP 中的解法吧。 先乘除後加減,看到括號先做 先舉一個簡單的例子 a+b 該怎麼做呢,有學過一點資料結構的應該很快就會回想起「中序轉後序」。 首先會需要將引入的字串轉為中序 // 123 + 456 * -789 // => // ['123', '+', '456, '*', '-', '789'] function isOp(string $s): bool { return strpos("+-*/", $s) !== false ? true : false; } function changeStringToInfix(string $expression): array { $infix = []; $count = strlen($expression); for ($i = 0; $i < $count; $i++) { if (isOp($expression[$i]) === false) { $j = $i; while ($i < $count && (isOp($expression[$i]) === false)) { $i = $i + 1; } $infix[] = substr($expression, $j, $i - $j); $i = $i - 1; } else { $infix[] = substr($expression, $i, 1); } } return $infix; } 這時候可能有眼尖的會發現,不對阿中序怎麼可以兩個運算子(’*’, ‘-’)連在一起,恭喜你踩進四則運算第一個坑:負號可能是負號也可能是減號。於是可以使用一個偷吃步的方式,將運算子後的負號一率改成另一個代表負號的特殊符號,比如「@」。而這步可以使用正規表達式輕鬆辦到。...