poma1

Untitled

Aug 24th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.26 KB | None | 0 0
  1. <?php
  2. class RpnCalculate {
  3. //разделитель элементов в строке
  4. public $separator = " ";
  5. //математические операции. Для добавления операции добавить запись в этот массив и функцию strToArray.
  6. public $operations = ['+', '-', '*', '/', '^'];
  7.  
  8. private function strToArray($str){
  9. //удаляем лишние пробелы
  10. $str = trim($str);
  11. $str = preg_replace('# {2,}#',' ',$str); //Выполняет поиск и замену по регулярному выражению
  12. $array = explode($this->separator, $str); //Разбивает строку с помощью разделителя
  13. return $array;
  14. }
  15. private function calculate($a, $b, $c){
  16. if($c=='+')
  17. $result = $a + $b;
  18. elseif($c=='-')
  19. $result = $a - $b;
  20. elseif($c=='*')
  21. $result = $a * $b;
  22. elseif($c=='/')
  23. {
  24. if($b==0)
  25. throw new Exception("Делить на ноль");
  26. $result = $a / $b;
  27. }
  28. else $result = pow($a, $b);
  29.  
  30. return $result;
  31.  
  32. }
  33. public function calculating($str){
  34. $array = $this->strToArray($str);
  35. $stack = [];
  36. foreach ($array as $token) {
  37. if (in_array($token, $this->operations)) { //Проверяет, присутствует ли в массиве значение
  38. if (count($stack) < 2) {
  39. throw new Exception("Недостаточно данных для операции '$token'");
  40. }
  41. $b = array_pop($stack); //Извлекает последний элемент массива
  42. $a = array_pop($stack);
  43. $result = $this->calculate($a, $b, $token);
  44. array_push($stack, $result);
  45. }
  46. elseif (is_numeric($token)) { //Проверяет, является ли переменная числом или строкой, содержащей число
  47. array_push($stack, $token); //Добавляет один или несколько элементов в конец массива
  48. }
  49. else {
  50. throw new Exception("Недопустимый символ: \"$token\"");
  51. }
  52. }
  53. if (count($stack) > 1) {
  54. throw new Exception("Количество операторов не соответствует количеству операндов");
  55. }
  56. return array_pop($stack);
  57. }
  58.  
  59. }
Advertisement
Add Comment
Please, Sign In to add comment