Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.math.BigDecimal;
- import java.util.Stack;
- public class Solve {
- public static void main(String[] args) throws IOException {
- BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
- String expression = userInput.readLine();
- Stack<Character> parenthesisOccurrence = new Stack<>();
- Stack<Integer> parenthesisIndexes = new Stack<>();
- solveExpression(expression);
- }
- static char openBracket = '(';
- static char closeBracket = ')';
- static BigDecimal sum = BigDecimal.valueOf(0);
- static String innerExpression = "";
- static String tempResult;
- static BigDecimal result = BigDecimal.valueOf(0);
- static int startIndex = 0;
- static int endIndex = 0;
- private static void solveExpression(String expression) {
- if (expression.matches("\\d*")) {
- System.out.println(Integer.parseInt(expression));
- return;
- }
- if (!expression.contains(String.valueOf(openBracket)) && !expression.contains(String.valueOf(closeBracket))) {
- System.out.println(evaluate(expression));
- return;
- }
- Stack<Character> parenthesisOccurrence = new Stack<>();
- Stack<Integer> parenthesisIndexes = new Stack<>();
- for (int i = 0; i < expression.length(); i++) {
- char c = expression.charAt(i);
- if (c == openBracket) {
- parenthesisOccurrence.push(c);
- parenthesisIndexes.push(i);
- } else {
- if (parenthesisOccurrence.size() > 0
- && c == closeBracket
- && parenthesisOccurrence.peek() == openBracket) {
- startIndex = parenthesisIndexes.peek();
- endIndex = i + 1;
- innerExpression = expression.substring(startIndex, endIndex);
- tempResult = innerExpression.split("[\\(\\)]")[1];
- expression = expression.replace(expression.substring(startIndex, endIndex), String.valueOf(evaluate(innerExpression)));
- //System.out.println(expression);
- break;
- }
- }
- }
- solveExpression(expression);
- /*if(!innerExpression.equals("")) {
- tempResult = innerExpression.split("[\\(\\)]")[1];
- }else{
- tempResult = expression;
- }*/
- }
- private static BigDecimal evaluate(String s) {
- int md = -1; // 0 is m, 1 is d
- int sign = 1; // 1 is +, -1 is -
- int prev = 0;
- int result = 0;
- for (int i = 0; i < s.length(); i++) {
- char c = s.charAt(i);
- if (Character.isDigit(c)) {
- int num = c - '0';
- while (++i < s.length() && Character.isDigit(s.charAt(i))) {
- num = num * 10 + s.charAt(i) - '0';
- }
- i--; // back to last digit of number
- if (md == 0) {
- prev = prev * num;
- md = -1;
- } else if (md == 1) {
- prev = prev / num;
- md = -1;
- } else {
- prev = num;
- }
- } else if (c == '/') {
- md = 1;
- } else if (c == '*') {
- md = 0;
- } else if (c == '+') {
- result = result + sign * prev;
- sign = 1;
- } else if (c == '-' && Character.isDigit(s.charAt(i-1))) {
- result = result + sign * prev;
- sign = -1;
- }else if (c == '-') {
- //result = result + sign * prev;
- sign = -1;
- }
- }
- result = result + sign * prev;
- return BigDecimal.valueOf(result);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement