Advertisement
Nekogochan

ЫАЫЫЫЫЫЫЫЫЫЫЫЫЫ

Jan 19th, 2022
879
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.62 KB | None | 0 0
  1. import java.util.Map;
  2. import java.util.Optional;
  3. import java.util.Stack;
  4. import java.util.regex.Pattern;
  5.  
  6. interface DoubleBiFunction {
  7.     double apply(double a, double b);
  8. }
  9.  
  10. enum Operator {
  11.     ADD("+"),
  12.     SUBTRACT("-"),
  13.     MULTIPLY("*"),
  14.     DIVIDE("/");
  15.  
  16.     String op;
  17.  
  18.     Operator(String op) {
  19.         this.op = op;
  20.     }
  21.  
  22.     private static final Map<String, DoubleBiFunction> fn = Map.of(
  23.         "+", (a, b) -> a + b,
  24.         "-", (a, b) -> a - b,
  25.         "*", (a, b) -> a * b,
  26.         "/", (a, b) -> a / b
  27.     );
  28.  
  29.     private static final Map<String, Operator> reverseMapper = Map.of(
  30.         "+", ADD,
  31.         "-", SUBTRACT,
  32.         "*", MULTIPLY,
  33.         "/", DIVIDE
  34.     );
  35.  
  36.     public double call(double a, double b) {
  37.         return fn.get(op).apply(a, b);
  38.     }
  39.  
  40.     static Optional<Operator> ofNullable(String op) {
  41.         return Optional.ofNullable(reverseMapper.get(op));
  42.     }
  43. }
  44.  
  45. class Calc {
  46.     public double evaluate(String expr) {
  47.         Stack<Double> expressions = new Stack<>();
  48.         Pattern.compile("(\\s)")
  49.             .splitAsStream(expr)
  50.             .filter((s) -> !s.isEmpty())
  51.             .forEach((s) -> Operator.ofNullable(s)
  52.                 .ifPresentOrElse(
  53.                     (op) -> {
  54.                         var right = expressions.pop();
  55.                         var left = expressions.pop();
  56.                         expressions.push(op.call(left, right));
  57.                     },
  58.                     () -> expressions.push(Double.parseDouble(s))
  59.                 )
  60.             );
  61.         return expressions.isEmpty() ? 0 : expressions.pop();
  62.     }
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement