SHARE
TWEET

Untitled

a guest May 19th, 2019 67 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.math.BigDecimal;
  5. import java.util.Stack;
  6.  
  7. public class Solve {
  8.     public static void main(String[] args) throws IOException {
  9.         BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
  10.         String expression = userInput.readLine();
  11.  
  12.         Stack<Character> parenthesisOccurrence = new Stack<>();
  13.         Stack<Integer> parenthesisIndexes = new Stack<>();
  14.  
  15.         solveExpression(expression);
  16.     }
  17.  
  18.     static char openBracket = '(';
  19.     static char closeBracket = ')';
  20.     static BigDecimal sum = BigDecimal.valueOf(0);
  21.     static String innerExpression = "";
  22.     static String tempResult;
  23.     static BigDecimal result = BigDecimal.valueOf(0);
  24.     static int startIndex = 0;
  25.     static int endIndex = 0;
  26.  
  27.     private static void solveExpression(String expression) {
  28.         if (expression.matches("\\d*")) {
  29.             System.out.println(Integer.parseInt(expression));
  30.             return;
  31.         }
  32.  
  33.         if (!expression.contains(String.valueOf(openBracket)) && !expression.contains(String.valueOf(closeBracket))) {
  34.             System.out.println(evaluate(expression));
  35.             return;
  36.         }
  37.  
  38.         Stack<Character> parenthesisOccurrence = new Stack<>();
  39.         Stack<Integer> parenthesisIndexes = new Stack<>();
  40.  
  41.         for (int i = 0; i < expression.length(); i++) {
  42.             char c = expression.charAt(i);
  43.             if (c == openBracket) {
  44.                 parenthesisOccurrence.push(c);
  45.                 parenthesisIndexes.push(i);
  46.             } else {
  47.                 if (parenthesisOccurrence.size() > 0
  48.                         && c == closeBracket
  49.                         && parenthesisOccurrence.peek() == openBracket) {
  50.                     startIndex = parenthesisIndexes.peek();
  51.                     endIndex = i + 1;
  52.  
  53.                     innerExpression = expression.substring(startIndex, endIndex);
  54.                     tempResult = innerExpression.split("[\\(\\)]")[1];
  55.                     expression = expression.replace(expression.substring(startIndex, endIndex), String.valueOf(evaluate(innerExpression)));
  56.                     //System.out.println(expression);
  57.                     break;
  58.                 }
  59.             }
  60.         }
  61.  
  62.         solveExpression(expression);
  63.  
  64.         /*if(!innerExpression.equals("")) {
  65.             tempResult = innerExpression.split("[\\(\\)]")[1];
  66.         }else{
  67.             tempResult = expression;
  68.         }*/
  69.  
  70.     }
  71.  
  72.     private static BigDecimal evaluate(String s) {
  73.         int md = -1; // 0 is m, 1 is d
  74.         int sign = 1; // 1 is +, -1 is -
  75.         int prev = 0;
  76.         int result = 0;
  77.  
  78.         for (int i = 0; i < s.length(); i++) {
  79.             char c = s.charAt(i);
  80.             if (Character.isDigit(c)) {
  81.                 int num = c - '0';
  82.                 while (++i < s.length() && Character.isDigit(s.charAt(i))) {
  83.                     num = num * 10 + s.charAt(i) - '0';
  84.                 }
  85.                 i--; // back to last digit of number
  86.  
  87.                 if (md == 0) {
  88.                     prev = prev * num;
  89.                     md = -1;
  90.                 } else if (md == 1) {
  91.                     prev = prev / num;
  92.                     md = -1;
  93.                 } else {
  94.                     prev = num;
  95.                 }
  96.             } else if (c == '/') {
  97.                 md = 1;
  98.             } else if (c == '*') {
  99.                 md = 0;
  100.             } else if (c == '+') {
  101.                 result = result + sign * prev;
  102.                 sign = 1;
  103.             } else if (c == '-' && Character.isDigit(s.charAt(i-1))) {
  104.                 result = result + sign * prev;
  105.                 sign = -1;
  106.             }else if (c == '-') {
  107.                 //result = result + sign * prev;
  108.                 sign = -1;
  109.             }
  110.  
  111.         }
  112.  
  113.         result = result + sign * prev;
  114.         return BigDecimal.valueOf(result);
  115.     }
  116. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top