Cod sursa(job #2229460)

Utilizator radustn92Radu Stancu radustn92 Data 6 august 2018 20:47:36
Problema Evaluarea unei expresii Scor 100
Compilator java Status done
Runda Arhiva educationala Marime 4.14 kb
import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("evaluare.in");
        OutputStream outputStream = new FileOutputStream("evaluare.out");

        try (InputReader inputReader = new InputReader(inputStream);
             PrintWriter printWriter = new PrintWriter(outputStream)) {
            Solver.solve(inputReader, printWriter);
        }
    }

    static class Solver {

        private static int evalBinaryExpr(int term1, int term2, char op) {
            switch (op) {
                case '+':
                    return term1 + term2;
                case '-':
                    return term1 - term2;
                case '*':
                    return term1 * term2;
                case '/':
                    return term1 / term2;
            }

            throw new RuntimeException("Found an unexpected operation");
        }

        private static int resolvePriorityZeroExpr(StringIterator stringIterator) {
            int result = resolvePriorityOneExpr(stringIterator);

            char nextCharacter;
            while (stringIterator.hasNext() && (stringIterator.next() == '+' || stringIterator.next() == '-')) {
                nextCharacter = stringIterator.next();
                stringIterator.inc();

                result = evalBinaryExpr(result, resolvePriorityOneExpr(stringIterator), nextCharacter);
            }

            return result;
        }

        private static int resolvePriorityOneExpr(StringIterator stringIterator) {
            int result = resolvePriorityTwoExpr(stringIterator);

            char nextCharacter;
            while (stringIterator.hasNext() && (stringIterator.next() == '*' || stringIterator.next() == '/')) {
                nextCharacter = stringIterator.next();
                stringIterator.inc();

                result = evalBinaryExpr(result, resolvePriorityTwoExpr(stringIterator), nextCharacter);
            }

            return result;
        }

        private static int resolvePriorityTwoExpr(StringIterator stringIterator) {
            int result = 0;
            if (stringIterator.next() == '(') {
                stringIterator.inc();
                result = resolvePriorityZeroExpr(stringIterator);
                stringIterator.inc();
            } else {
                while (stringIterator.hasNext() && Character.isDigit(stringIterator.next())) {
                    result = result * 10 + stringIterator.next() - '0';
                    stringIterator.inc();
                }
            }

            return result;
        }

        public static void solve(InputReader inputReader, PrintWriter printWriter) {
            String arithmeticExpr = inputReader.nextToken();
            printWriter.println(resolvePriorityZeroExpr(new StringIterator(arithmeticExpr)));
        }
    }

    static class StringIterator {

        private char[] data;

        private int pos;

        public StringIterator(String expr) {
            data = expr.toCharArray();
            pos = 0;
        }

        public boolean hasNext() {
            return pos < data.length;
        }

        public char next() {
            return data[pos];
        }

        public void inc() {
            pos++;
        }
    }

    static class InputReader implements AutoCloseable {
        private BufferedReader bufferedReader;

        private StringTokenizer stringTokenizer;

        public InputReader(InputStream inputStream) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            stringTokenizer = null;
        }


        public String nextToken() {
            if (stringTokenizer == null || !stringTokenizer.hasMoreTokens()) {
                try {
                    stringTokenizer = new StringTokenizer(bufferedReader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }

            return stringTokenizer.nextToken();
        }

        @Override
        public void close() throws IOException {
            bufferedReader.close();
        }
    }
}