Pagini recente » Cod sursa (job #827177) | Cod sursa (job #2646099) | Cod sursa (job #2718812) | Cod sursa (job #1470029) | Cod sursa (job #2229460)
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();
}
}
}