题解 | 牛牛计算器
牛牛计算器
https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace
- L39 处理空格
- L43 L68 用于处理 负数表达
- L84 最后计算不要忘了
public class Solution { public int priority(Character op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; } return 1; } public void calc(Deque<Character> ops, Deque<Integer> nums) { if (ops.isEmpty() || nums.size() < 2) { return; } final Character op = ops.removeLast(); final Integer b = nums.removeLast(); final Integer a = nums.removeLast(); switch (op) { case '+': nums.addLast(a + b); break; case '-': nums.addLast(a - b); break; case '*': nums.addLast(a * b); break; case '/': nums.addLast(a / b); break; } } public int calculate (String s) { Deque<Integer> nums = new ArrayDeque<>(); Deque<Character> ops = new ArrayDeque<>(); s = s.replace(" ", ""); final char[] chars = s.toCharArray(); final int len = chars.length; int i = 0; nums.addLast(0); while (i < len) { if (chars[i] == '(') { ++i; ops.addLast('('); continue; } if (Character.isDigit(chars[i])) { int num = 0; while (i < len && Character.isDigit(chars[i])) { num = num * 10 + chars[i] - '0'; ++i; } nums.addLast(num); continue; } if (chars[i] == ')') { while (!ops.isEmpty() && ops.getLast() != '(') { calc(ops, nums); } ops.removeLast(); ++i; continue; } if (i > 0 && (chars[i - 1] == '(')) { nums.addLast(0); } while (!ops.isEmpty() && ops.getLast() != '(' && priority(ops.getLast()) >= priority(chars[i])) { calc(ops, nums); } ops.addLast(chars[i]); ++i; } while (!ops.isEmpty()) { calc(ops, nums); } return nums.getLast(); } }