题解 | #四则运算#
四则运算
https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); String s = in.nextLine(); System.out.println(func(replace(s))); } private static String replace(String s) { while (s.contains("[")) { s = s.replace('[', '('); } while (s.contains("]")) { s = s.replace(']', ')'); } while (s.contains("{")) { s = s.replace('{', '('); } while (s.contains("}")) { s = s.replace('}', ')'); } return s; } private static int func(String s) { try { return Integer.parseInt(s); } catch (Exception e) { } if (s.contains("(")) { return func(handleK(s)); } return handleOp(s); } private static String handleK(String s) { int i = s.indexOf("("); int j = searchEndK(s, i); String sub = s.substring(i + 1, j); int v = func(sub); return subStr(s, i - 1, j + 1, v); } private static int searchEndK(String s, int i) { int count = 1; for (int j = i + 1; j < s.length(); j++) { char c = s.charAt(j); if (c == '(') { count++; } else if (c == ')') { count--; if (count == 0) { return j; } } } return -1; } private static String subStr(String s, int i, int j, int v) { String left = i >= 0 ? s.substring(0, i + 1) : ""; String right = j < s.length() ? s.substring(j) : ""; return left + v + right; } private static int handleOp(String s) { Stack<Integer> num = new Stack<>(); Stack<Character> op = new Stack<>(); for (int i = 0; i < s.length();) { char c = s.charAt(i); i = handleNum(s, i, num); if (i >= s.length()) { break; } i = handleMult(s, i, num, op); if (i >= s.length()) { break; } i = handleAdd(s, i, num, op); if (i >= s.length()) { break; } } int sum = num.get(0); for (int i = 0, j = 1; i < op.size() && j < num.size(); i++, j++) { char c = op.get(i); int a = num.get(j); sum = val(a, sum, c); } return sum; } private static int handleNum(String s, int i, Stack<Integer> num) { int ii = handleNum1(s, i, num); if (ii > i) { return ii; } return handleNum2(s, i, num); } private static int handleNum1(String s, int i, Stack<Integer> num) { char c = s.charAt(i); // 数字 if (!Character.isDigit(c)) { return i; } // 数字的开始 StringBuilder sb = new StringBuilder(); while (Character.isDigit(c)) { sb.append(c); i++; if (i >= s.length()) { break; } c = s.charAt(i); } int n = Integer.parseInt(sb.toString()); num.push(n); return i; } private static int handleNum2(String s, int i, Stack<Integer> num) { char c = s.charAt(i); char pre = i > 0 ? s.charAt(i - 1) : '-'; // 数字 // 负号,前面不是数字则为负号 if (c != '-' || Character.isDigit(pre)) { return i; } // 数字的开始 StringBuilder sb = new StringBuilder(); sb.append(c); i++; c = s.charAt(i); while (Character.isDigit(c)) { sb.append(c); i++; if (i >= s.length()) { break; } c = s.charAt(i); } int n = Integer.parseInt( sb.toString()); num.push(n); return i; } private static int handleMult(String s, int i, Stack<Integer> num, Stack<Character> op) { char c = s.charAt(i); if (c != '*' && c != '/') { return i; } i++; int ii = handleNum(s, i, num); int a = num.pop(); int b = num.pop(); int v = val(a, b, c); num.push(v); return ii; } private static int handleAdd(String s, int i, Stack<Integer> num, Stack<Character> op) { char c = s.charAt(i); if (c != '+' && c != '-') { return i; } i++; op.push(c); return handleNum(s, i, num); } private static int val(int a, int b, char c) { int v; if (c == '*') { v = b * a; } else if (c == '/') { v = b / a; } else if (c == '+') { v = b + a; } else { v = b - a; } return v; } }