|
@@ -0,0 +1,88 @@
|
|
|
+import java.util.Scanner;
|
|
|
+import java.util.Stack;
|
|
|
+
|
|
|
+public class Calculator {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ try (Scanner sc = new Scanner(System.in)) {
|
|
|
+ String str = sc.nextLine();
|
|
|
+ System.out.println(calculate(str));
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int calculate(String str) throws Exception {
|
|
|
+ char[] exp = str.toCharArray();
|
|
|
+ Stack<Character> ops = new Stack<>();
|
|
|
+ Stack<Integer> num = new Stack<>();
|
|
|
+ // + - * / ( ) $
|
|
|
+ // + > > < < < > >
|
|
|
+ // - > > < < < > >
|
|
|
+ // * > > > > < > >
|
|
|
+ // / > > > > < > >
|
|
|
+ // ( < < < < < =
|
|
|
+ // E < < < < < ac
|
|
|
+ for (int i = 0; i <= exp.length;) {
|
|
|
+ if (i == exp.length) {
|
|
|
+ if (ops.isEmpty()) break;
|
|
|
+ if (ops.peek() == '(') throw new Exception("Invalid exp!");
|
|
|
+ num.push(operate(ops.pop(), num.pop(), num.pop()));
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ switch (exp[i]) {
|
|
|
+ case '+': case '-':
|
|
|
+ if (ops.isEmpty() || ops.peek() == '(') {
|
|
|
+ ops.push(exp[i]);
|
|
|
+ i++;
|
|
|
+ } else {
|
|
|
+ num.push(operate(ops.pop(), num.pop(), num.pop()));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case '*': case '/':
|
|
|
+ if (ops.isEmpty() || ops.peek() == '(' || ops.peek() == '+' || ops.peek() == '-') {
|
|
|
+ ops.push(exp[i]);
|
|
|
+ i++;
|
|
|
+ } else {
|
|
|
+ num.push(operate(ops.pop(), num.pop(), num.pop()));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case '(':
|
|
|
+ ops.push('(');
|
|
|
+ i++;
|
|
|
+ break;
|
|
|
+ case ')':
|
|
|
+ if (ops.isEmpty()) throw new Exception("Invalid exp!");
|
|
|
+ if (ops.peek() == '(') {
|
|
|
+ ops.pop();
|
|
|
+ i++;
|
|
|
+ } else {
|
|
|
+ num.push(operate(ops.pop(), num.pop(), num.pop()));
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ int j;
|
|
|
+ for (j = i + 1; j < exp.length && '0' <= exp[j] && exp[j] <= '9'; j++);
|
|
|
+ int n = Integer.parseInt(str.substring(i, j));
|
|
|
+ num.push(n);
|
|
|
+ i = j;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (num.size() != 1) throw new Exception("Invalid exp!");
|
|
|
+ return num.peek();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int operate(char op, int n2, int n1) throws Exception {
|
|
|
+ switch (op) {
|
|
|
+ case '+':
|
|
|
+ return n1 + n2;
|
|
|
+ case '-':
|
|
|
+ return n1 - n2;
|
|
|
+ case '*':
|
|
|
+ return n1 * n2;
|
|
|
+ case '/':
|
|
|
+ if (n2 == 0) throw new Exception("Divided by 0!");
|
|
|
+ return n1 / n2;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+}
|