leetcode——计算器

本文介绍了一个可以处理正负数、基本算术运算及括号的Solution类,展示了如何将字符串转换为逆波兰表达式并计算结果。重点讲解了处理空格、负数和运算符优先级的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可以实现正数、负数、+、-、*、/、(、)的运算

class Solution {
    public int calculate(String s) {
        List<String> words = getInversePolishExpressions(handleSpacesAndNegativeNumber(s));
        return calculateResult(words);
    }

    private int calculateResult(List<String> words) {
        Stack<Integer> numbers = new Stack<>();
        for (String word : words) {
            if (isNumber(word.charAt(0))) {
                numbers.push(Integer.parseInt(word));
            } else {
                int second = numbers.pop();
                int first = numbers.pop();
                int res;
                switch (word) {
                    case "+":
                        res = first + second;
                        break;
                    case "-":
                        res = first - second;
                        break;
                    case "*":
                        res = first * second;
                        break;
                    case "/":
                        res = first / second;
                        break;
                    default:
                        res = -1;
                        break;
                }
                numbers.push(res);
            }
        }
        return numbers.peek();
    }

    private String handleSpacesAndNegativeNumber(String s) {
        s = s.replaceAll(" ", "");
        char[] letters = s.toCharArray();
        StringBuilder expression = new StringBuilder();
        for (char letter : letters) {
            if (letter == '+' || letter == '-') {
                if (expression.length() < 1 || expression.charAt(expression.length() - 1) == '(') {
                    expression.append('0');
                }
            }
            expression.append(letter);
        }
        return expression.toString();
    }

    private List<String> getInversePolishExpressions(String s) {
        List<String> words = new ArrayList<>();
        Stack<Character> operands = new Stack<>();
        char[] letters = s.toCharArray();
        operands.push('#');
        int len = letters.length;
        int i = 0;
        while (i < len) {
            if (isNumber(letters[i])) {
                StringBuilder number = new StringBuilder();
                while (i < len && isNumber(letters[i])) {
                    number.append(letters[i]);
                    i++;
                }
                words.add(number.toString());
            } else {
                if (letters[i] == '(') {
                    operands.push(letters[i]);
                } else if (letters[i] == ')') {
                    while (!operands.empty() && operands.peek() != '(') {
                        words.add(operands.pop() + "");
                    }
                    operands.pop();
                } else {
                    while (!operands.empty() && operands.peek() != '(' && getPriorityValue(letters[i]) <= getPriorityValue(operands.peek())) {
                        words.add(operands.pop() + "");
                    }
                    operands.push(letters[i]);
                }
                i++;
            }
        }
        while (operands.peek() != '#') {
            words.add(operands.pop() + "");
        }
        return words;
    }

    private int getPriorityValue(char c) {
        switch (c) {
            case '#':
                return 0;
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            default:
                return -1;
        }
    }

    private boolean isNumber(char c) {
        return c >= '0' && c <= '9';
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值