欢迎访问宙启技术站
智能推送

使用Java函数实现算术表达式求值

发布时间:2023-06-14 21:10:06

求值算术表达式是一个很基础的计算机问题,可以使用栈来解决。实现该问题主要包括以下几个步骤:

1. 将中缀表达式转换为后缀表达式;

2. 利用后缀表达式进行求值计算。

以下是使用Java函数实现算术表达式求值的具体步骤:

1. 将中缀表达式转换为后缀表达式

中缀表达式是指将操作符位于操作数中间的表达式,例如:3+5-2*4/6。而后缀表达式是指将操作符位于操作数后面的表达式,例如:3 5 + 2 4 * 6 / -。

中缀表达式转后缀表达式的基本步骤如下:

1. 从左到右遍历中缀表达式中的每个符号;

2. 如果当前符号是数字,则直接将其加入到后缀表达式中;

3. 如果当前符号是左括号,则将其加入到栈中;

4. 如果当前符号是右括号,则将栈顶的符号依次弹出并加入到后缀表达式中,直到遇到左括号为止,左括号不加入后缀表达式;

5. 如果当前符号是操作符,则比较其与栈顶符号的优先级,如果栈顶符号优先级不低于当前符号,则将栈顶符号弹出并加入到后缀表达式中,重复此操作直到栈顶符号优先级低于当前符号再将当前符号加入到栈中;

6. 重复步骤1-5,直到遍历完中缀表达式;

7. 如果栈中还有符号,则依次弹出并加入到后缀表达式中。

以下是Java函数实现算术表达式中缀转后缀的代码:

public static String infixToSuffix(String expression) {
    Stack<Character> operatorStack = new Stack<>();
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < expression.length(); i++) {
        char ch = expression.charAt(i);
        if (Character.isDigit(ch)) {  // 如果是数字,则直接加入到后缀表达式中
            sb.append(ch);
            if (i == expression.length() - 1 || !Character.isDigit(expression.charAt(i + 1))) {
                sb.append(" ");  // 每个数字之间以空格分隔
            }
        } else if (ch == '(') {  // 如果是左括号,则将其加入到栈中
            operatorStack.push(ch);
        } else if (ch == ')') {  // 如果是右括号,则将栈中符号弹出直到遇到左括号
            while (!operatorStack.isEmpty() && operatorStack.peek() != '(') {
                sb.append(operatorStack.pop()).append(" ");
            }
            if (!operatorStack.isEmpty() && operatorStack.peek() == '(') {
                operatorStack.pop();
            }
        } else if (isOperator(ch)) {  // 如果是操作符,则比较其与栈顶符号的优先级
            while (!operatorStack.isEmpty()
                    && operatorStack.peek() != '('
                    && compareOperator(ch, operatorStack.peek())) {
                sb.append(operatorStack.pop()).append(" ");
            }
            operatorStack.push(ch);
        }
    }
    while (!operatorStack.isEmpty()) {
        sb.append(operatorStack.pop()).append(" ");
    }
    return sb.toString().trim();
}

// 判断是否为操作符
private static boolean isOperator(char ch) {
    return ch == '+' || ch == '-' || ch == '*' || ch == '/';
}

// 比较两个操作符的优先级
private static boolean compareOperator(char ch1, char ch2) {
    if (ch1 == '*' || ch1 == '/') {
        return true;
    }
    if (ch1 == '+' || ch1 == '-') {
        return (ch2 == '+' || ch2 == '-');
    }
    return false;
}

2. 利用后缀表达式进行求值计算

已经将中缀表达式转换为后缀表达式后,可以利用栈来计算后缀表达式的值。具体步骤如下:

1. 从左到右遍历后缀表达式中的每个符号;

2. 如果当前符号是数字,则将其加入到栈中;

3. 如果当前符号是操作符,则从栈中弹出两个数字进行计算,并将结果压入栈中;

4. 重复步骤1-3,直到遍历完后缀表达式;

5. 最终栈中仅剩一个元素,即为表达式的计算结果。

以下是Java函数实现算术表达式求值的代码:

public static double evaluate(String suffixExpression) {
    Stack<Double> operandStack = new Stack<>();
    for (String item : suffixExpression.split(" ")) {
        if (isNumeric(item)) {  // 如果是数字,则将其入栈
            operandStack.push(Double.parseDouble(item));
        } else {  // 如果是操作符,则从栈中弹出两个数字进行计算
            double num2 = operandStack.pop();
            double num1 = operandStack.pop();
            double result = calculate(num1, num2, item);
            operandStack.push(result);
        }
    }
    return operandStack.pop();  // 最终栈中仅剩一个元素,即为结果
}

// 判断字符串是否为数字
private static boolean isNumeric(String str) {
    try {
        Double.parseDouble(str);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

// 根据操作符计算结果
private static double calculate(double num1, double num2, String operator) {
    switch (operator) {
        case "+":
            return num1 + num2;
        case "-":
            return num1 - num2;
        case "*":
            return num1 * num2;
        case "/":
            return num1 / num2;
        default:
            throw new IllegalArgumentException("Invalid operator: " + operator);
    }
}

以上就是使用Java函数实现算术表达式求值的具体步骤和代码实现。通过该方法可以将中缀表达式转为后缀表达式,并且可以对后缀表达式进行求值计算,实现了一个基本的计算器功能。