VirKato

Считаем математическое выражение.

Jun 19th, 2022 (edited)
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.46 KB | None | 0 0
  1.     public double expression(String str) {
  2.         //str содержит математическое выражение без пробелов
  3.         if (check_brackets(str)) {
  4.             System.out.println ("Скобки успешно совпадают!");
  5.             return calculate(getTokens(f(str)));
  6.         } else {
  7.             System.out.println ("Соответствие скобок не выполнено или содержит неправильные скобки!");
  8.         }
  9.         return Double.NaN;
  10.     }
  11.  
  12.     /**
  13.      *
  14.      * @param str
  15.      * Входящая полная тестовая строка арифметического выражения
  16.      * @return возвращает логическое значение, если совпадение успешно, возвращает true, иначе false
  17.      */
  18.     public boolean check_brackets(String str) {
  19.         Stack<Character> s = new Stack<Character>();
  20.         /**********************************/
  21.         char[] ch = new char[128];
  22.         ch['1'] = '1';
  23.         ch['2'] = '2';
  24.         ch['3'] = '3';
  25.         ch['4'] = '4';
  26.         ch['5'] = '5';
  27.         ch['6'] = '6';
  28.         ch['7'] = '7';
  29.         ch['8'] = '8';
  30.         ch['9'] = '9';
  31.         ch['0'] = '0';
  32.         ch['('] = '(';
  33.         ch[')'] = ')';
  34.         ch['['] = '[';
  35.         ch[']'] = ']';
  36.         ch['{'] = '{';
  37.         ch['}'] = '}';
  38.         ch['.'] = '.';
  39.         ch['+'] = '+';
  40.         ch['-'] = '-';
  41.         ch['*'] = '*';
  42.         ch['/'] = '/';
  43.         /**********************************/
  44.         for (int i = 0; i < str.length(); i++) {
  45.             char t = str.charAt(i);
  46.             if (t > 128 || ch[t] != t) {
  47.                 return false;
  48.             }
  49.             if (t == '(' || t == '[' || t == '{') {
  50.                 s.push(t);
  51.             } else if (t == ')' || t == ']' || t == '}') {
  52.                 char temp = '\u0000';
  53.                 if (s.size() > 0)
  54.                     temp = s.pop();
  55.                 else
  56.                     return false;
  57.                 if (!((temp == '(' && t == ')') || (temp == '[' && t == ']') || (temp == '{' && t == '}'))) {
  58.                     return false;
  59.                 }
  60.             } else {
  61.  
  62.             }
  63.         }
  64.         if (s.size() != 0)
  65.             return false;
  66.         return true;
  67.         /**********************************/
  68.     }
  69.  
  70.     /**
  71.      *
  72.      * @param str
  73.      * Входящая полная тестовая строка арифметического выражения
  74.      * @return Полная строка теста арифметического выражения, состоящая из каждого элемента массива
  75.      */
  76.     public Object[] f(String str) {
  77.         Stack<Object> s = new Stack<Object>();
  78.         int left = 0, right = 0, tag = ((str.charAt(0) >= '0' && str.charAt(0) <= '9')
  79.                 || (str.charAt(0) == '.') ? 0 : 1);
  80.         for (int i = 0; i < str.length(); i++) {
  81.             char t = str.charAt(i);
  82.             if ((t >= '0' && t <= '9') || (t == '.')) {
  83.                 right++;
  84.                 tag = 0;
  85.             } else {
  86.                 if (left != right) {
  87.                     s.push(new Double(str.substring(left, right)));
  88.                     left = right;
  89.                 }
  90.                 right++;
  91.                 s.push(str.substring(left, right));
  92.                 left = right;
  93.                 tag = 1;
  94.             }
  95.             if (right == str.length()) {
  96.                 if (left != right) {
  97.                     if (tag == 1)
  98.                         s.push(str.substring(left, right));
  99.                     else
  100.                         s.push(new Double(str.substring(left, right)));
  101.                     left = right;
  102.                 }
  103.             }
  104.         }
  105.         System.out.println(Arrays.toString(s.toArray()));
  106.         return s.toArray();
  107.     }
  108.  
  109.     /**
  110.      * Получить суффиксное выражение
  111.      *
  112.      * @param f
  113.      * Полная тестовая строка арифметического выражения, состоящая из каждого элемента массива
  114.      * @return массив выражений суффиксов
  115.      */
  116.     public Object[] getTokens(Object[] f) {
  117.         Stack<Object> s = new Stack<Object>();
  118.         Stack<Object> n = new Stack<Object>();
  119.         for (int i = 0; i < f.length; i++) {
  120.             if (f[i].equals("(") || f[i].equals("[") || f[i].equals("{")) {
  121.                 s.push("(");
  122.             } else if (f[i].equals("*")) {
  123.                 while ("/".equals((s.size() > 0) ? s.lastElement() : "")) {
  124.                     n.push(s.pop());
  125.                 }
  126.                 s.push("*");
  127.             } else if (f[i].equals("/")) {
  128.                 while ("*".equals((s.size() > 0) ? s.lastElement() : "")) {
  129.                     n.push(s.pop());
  130.                 }
  131.                 s.push("/");
  132.             } else if (f[i].equals("+")) {
  133.                 while (("*".equals((s.size() > 0) ? s.lastElement() : ""))
  134.                         || ("/").equals((s.size() > 0) ? s.lastElement() : "")
  135.                         || ("-").equals((s.size() > 0) ? s.lastElement() : "")) {
  136.                     n.push(s.pop());
  137.                 }
  138.                 s.push("+");
  139.             } else if (f[i].equals("-")) {
  140.                 while (("*".equals((s.size() > 0) ? s.lastElement() : ""))
  141.                         || ("/").equals((s.size() > 0) ? s.lastElement() : "")
  142.                         || ("+").equals((s.size() > 0) ? s.lastElement() : "")) {
  143.                     n.push(s.pop());
  144.                 }
  145.                 s.push("-");
  146.             } else if (f[i].equals(")") || f[i].equals("]") || f[i].equals("}")) {
  147.                 while (!"(".equals((s.size() > 0) ? s.lastElement() : "")) {
  148.                     n.push(s.pop());
  149.                 }
  150.                 s.pop();
  151.             } else {
  152.                 n.push(f[i]);
  153.             }
  154.         }
  155.         while (s.size() > 0)
  156.             n.push(s.pop());
  157.         return n.toArray();
  158.     }
  159.  
  160.     /**
  161.      * Расчет
  162.      *
  163.      * @param f
  164.      * @return
  165.      */
  166.     public double calculate(Object[] f) {
  167.         Stack<Object> s = new Stack<Object>();
  168.         for (int i = 0; i < f.length; i++) {
  169.             if (f[i] instanceof Double) {
  170.                 s.push(f[i]);
  171.             } else if ("+".equals(f[i])) {
  172.                 double left = (double) s.pop();
  173.                 double right = (double) s.pop();
  174.                 s.push(add(right, left));
  175.             } else if ("-".equals(f[i])) {
  176.                 double left = (double) s.pop();
  177.                 double right = (double) s.pop();
  178.                 s.push(sub(right, left));
  179.             } else if ("*".equals(f[i])) {
  180.                 double left = (double) s.pop();
  181.                 double right = (double) s.pop();
  182.                 s.push(mul(right, left));
  183.             } else if ("/".equals(f[i])) {
  184.                 double left = (double) s.pop();
  185.                 double right = (double) s.pop();
  186.                 s.push(div(right, left));
  187.             } else {
  188.  
  189.             }
  190.         }
  191.         return (double) s.pop();
  192.     }
  193.  
  194.     public double add(double a, double b) {
  195.         return a + b;
  196.     }
  197.  
  198.     public double sub(double a, double b) {
  199.         return a - b;
  200.     }
  201.  
  202.     public double mul(double a, double b) {
  203.         return a * b;
  204.     }
  205.  
  206.     public double div(double a, double b) {
  207.         return a / b;
  208.     }
  209.  
Add Comment
Please, Sign In to add comment