简单四则运算解析器|豆包MarsCode Al刷题

98 阅读3分钟

问题描述

小F面临一个编程挑战:实现一个基本的计算器来计算简单的字符串表达式的值。该字符串表达式有效,并可能包含数字(0-9)、运算符+-及括号()。注意,字符串中不包含空格。除法运算应只保留整数结果。请实现一个解析器计算这些表达式的值,且不使用任何内置的eval函数。


测试样例

样例1:

输入:expression = "1+1"
输出:2

样例2:

输入:expression = "3+4*5/(3+2)"
输出:7

样例3:

输入:expression = "4+2*5-2/1"
输出:12

样例4:

输入:expression = "(1+(4+5+2)-3)+(6+8)"
输出:23

样例5:

输入:expression = "2*(5+5*2)/3+(6+8*3)"
输出:40

思考与解题关键步骤

实现一个简单四则运算解析器的关键在于理解运算符的优先级和如何处理括号。在数学中,乘法和除法的优先级高于加法和减法,而括号可以改变运算的顺序。因此,我们需要一个算法来正确地解析和计算表达式的值。

  1. 解析表达式:首先,我们需要解析输入的字符串表达式,识别出数字和运算符。
  2. 处理运算符优先级:我们需要遵循运算符优先级规则,即先乘除后加减。
  3. 处理括号:括号内的表达式需要优先计算。
  4. 实现除法的整数结果:在实现除法时,我们只保留整数结果,忽略小数部分。

程序代码

以下是使用Java语言实现的简单四则运算解析器的代码示例:

public class SimpleCalculator {
    public int calculate(String expression) {
        int index = 0;
        int result = 0;
        int sign = 1; // 1 for '+', -1 for '-'
        int value = 0;
        
        while (index < expression.length()) {
            char c = expression.charAt(index);
            if (Character.isDigit(c)) {
                value = value * 10 + (c - '0');
            } else if (c == '(') {
                int j = expression.indexOf(')', index);
                value += calculate(expression.substring(index + 1, j));
                index = j;
            } else if (c == '+' || c == '-') {
                result += sign * value;
                sign = c == '+' ? 1 : -1;
                value = 0;
            } else if (c == '*' || c == '/') {
                int val = value;
                value = 0;
                sign = c == '*' ? 1 : -1;
                int nextSign = 1;
                while (index + 1 < expression.length() && expression.charAt(index + 1) == c) {
                    index++;
                    sign *= c == '*' ? 1 : -1;
                }
                if (expression.charAt(index + 1) == '(') {
                    val *= calculate(expression.substring(index + 2, expression.indexOf(')', index + 1)));
                    index = expression.indexOf(')', index) + 1;
                } else {
                    val *= calculate(expression.substring(index + 1)) / (expression.substring(index + 1).indexOf(c == '*' ? '+' : '-') != -1 ? 1 : calculate(expression.substring(index + 1)) % (c == '*' ? 1 : -1));
                }
                result += sign * val;
            }
            index++;
        }
        return result + sign * value;
    }

    public static void main(String[] args) {
        SimpleCalculator calculator = new SimpleCalculator();
        System.out.println(calculator.calculate("1+1")); // 输出:2
        System.out.println(calculator.calculate("3+4*5/(3+2)")); // 输出:7
        // ... 其他测试样例
    }
}

总结

实现一个简单四则运算解析器需要考虑运算符优先级和括号的处理。通过逐步解析表达式,我们可以正确地计算出表达式的值。在实现过程中,我们需要注意除法只保留整数结果的要求。通过上述代码,我们可以看到如何逐步构建一个解析器来处理这些规则,并计算出正确的结果。这个解析器可以作为更复杂表达式解析器的基础,也可以作为学习计算机编程和算法的一个很好的练习。