Advertisement
Guest User

Untitled

a guest
May 19th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement