题解 | 牛牛计算器

牛牛计算器

https://www.nowcoder.com/practice/192ac31d5e054abcaa10b72d9b01cace

  1. L39 处理空格
  2. L43 L68 用于处理 负数表达
  3. 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();
    }
}

全部评论

相关推荐

VirtualBool:都去逗他了?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务