import java.util.Deque; import java.util.LinkedList; import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 while (in.hasNextLine()) { // 注意 while 处理多个 case System.out.println(hj54(in.nextLine())); } } //中缀表达式转后缀表达式 public static Deque<String> Mid2End(String str) { //用于存运算数 StringBuilder number = new StringBuilder(); //后缀表达式 Deque<String> deque = new LinkedList<>(); //运算操作符 Stack<Character> stack = new Stack<>(); boolean flag = false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c >= '0' && c <= '9') { number.append(c); } else { if (number.length() > 0) { if (flag) { deque.add("-" + number.toString()); flag = false; } else { deque.add(number.toString()); } number.delete(0, number.length()); } if (c == '(') { stack.push(c); } else if (c == ')') { char top = stack.peek(); while (top != '(') { deque.add(stack.pop() + ""); top = stack.peek(); } stack.pop(); } else if (c == '-' && (i == 0 || str.charAt(i - 1) == '(')) { // 用于处理运算数是负数的情况 比如:-1*(-1-1) => -1 -1 1 - * flag = true; } else { if (stack.size() <= 0 || stack.peek() == '(' || opeCompare(c, stack.peek())) { stack.push(c); } else { while (stack.size() > 0 && stack.peek() != '(' && !opeCompare(c, stack.peek())) { deque.add(stack.pop() + ""); } stack.push(c); } } } } if (number.length() > 0) { deque.add(number.toString()); } while (stack.size() > 0) { deque.add(stack.pop() + ""); } return deque; } //运算符优先级比较 public static boolean opeCompare(char a, char b) { if (a == '*' || a == '/') { if (b == '+' || b == '-') { return true; } } return false; } //后缀表达式计算 public static int hj54(String str) { Deque<String> deque = Mid2End(str); Stack<Integer> stack = new Stack<>(); while (deque.size() > 0) { String s = deque.pollFirst(); if (s.charAt(s.length() - 1) >= '0' && s.charAt(s.length() - 1) <= '9') { stack.push(Integer.parseInt(s)); } else { int b = stack.pop(); int a = stack.pop(); int r = 0; switch (s.charAt(0)) { case '*': r = a * b; break; case '/': r = a / b; break; case '+': r = a + b; break; case '-': r = a - b; break; default: break; } stack.push(r); } } return stack.pop(); } }