简单四则运算解析器|青训营笔记

90 阅读2分钟

让我们来逐步构建这个简单的四则运算解析器。我们可以使用栈来处理运算符的优先级和括号。以下是一些代码提示,帮助你实现这个功能:

  1. 处理数字和运算符

    • 使用两个栈,一个用于存储数字,另一个用于存储运算符。
  2. 处理括号

    • 当遇到左括号 ( 时,将其压入运算符栈。
    • 当遇到右括号 ) 时,从运算符栈中弹出运算符,直到遇到左括号 (
  3. 处理运算符

    • 当遇到运算符时,比较其与栈顶运算符的优先级。如果当前运算符优先级较低或相等,先处理栈顶运算符。
  4. 计算表达式

    • 当表达式处理完毕后,依次从运算符栈中弹出运算符,并从数字栈中弹出相应的数字进行计算。

以下是一些代码提示,帮助你实现这些步骤:

import java.util.Stack;

public class Main {
    public static int solution(String expression) {
        Stack<Integer> numbers = new Stack<>();
        Stack<Character> operators = new Stack<>();
        
        for (int i = 0; i < expression.length(); i++) {
            char ch = expression.charAt(i);
            
            if (Character.isDigit(ch)) {
                // 处理数字
                int num = ch - '0';
                while (i + 1 < expression.length() && Character.isDigit(expression.charAt(i + 1))) {
                    num = num * 10 + (expression.charAt(++i) - '0');
                }
                numbers.push(num);
            } else if (ch == '(') {
                // 处理左括号
                operators.push(ch);
            } else if (ch == ')') {
                // 处理右括号
                while (!operators.isEmpty() && operators.peek() != '(') {
                    // 计算括号内的表达式
                    // 这里需要实现一个计算函数
                    // numbers.push(calculate(numbers.pop(), numbers.pop(), operators.pop()));
                }
                operators.pop(); // 弹出左括号
            } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
                // 处理运算符
                while (!operators.isEmpty() && precedence(operators.peek()) >= precedence(ch)) {
                    // 计算优先级高的运算符
                    // 这里需要实现一个计算函数
                    // numbers.push(calculate(numbers.pop(), numbers.pop(), operators.pop()));
                }
                operators.push(ch);
            }
        }
        
        // 处理剩余的运算符
        while (!operators.isEmpty()) {
            // 这里需要实现一个计算函数
            // numbers.push(calculate(numbers.pop(), numbers.pop(), operators.pop()));
        }
        
        return numbers.pop();
    }
    
    // 计算运算符优先级
    private static int precedence(char op) {
        switch (op) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
        }
        return -1;
    }
    
    // 计算函数
    // private static int calculate(int b, int a, char op) {
    //     switch (op) {
    //         case '+': return a + b;
    //         case '-': return a - b;
    //         case '*': return a * b;
    //         case '/': return a / b;
    //     }
    //     return 0;
    // }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution("1+1") == 2);
        System.out.println(solution("3+4*5/(3+2)") == 7);
        System.out.println(solution("4+2*5-2/1") == 12);
        System.out.println(solution("(1+(4+5+2)-3)+(6+8)") == 23);
    }
}

关键步骤注释

  1. 处理数字:将字符串中的数字转换为整数并压入数字栈。
  2. 处理括号:遇到左括号时压入运算符栈,遇到右括号时计算括号内的表达式。
  3. 处理运算符:根据运算符的优先级进行计算。
  4. 计算函数:实现一个计算函数来处理具体的运算。

你可以根据这些提示逐步实现代码,如果有任何问题或需要进一步的帮助,请告诉我!