Java四则运算器的实现

作为一名经验丰富的开发者,我很高兴能够教会你如何实现一个Java四则运算器。下面是整个实现过程的流程表格。

步骤 描述
1 获取用户输入的表达式
2 将表达式转换为逆波兰表达式
3 计算逆波兰表达式的结果
4 输出计算结果

接下来我将详细解释每个步骤需要做什么,并提供相应的代码示例和注释。

步骤1:获取用户输入的表达式

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入表达式:");
        String expression = scanner.nextLine();
        scanner.close();
        // TODO: 将获取到的表达式传递给下一步处理
    }
}

在这个步骤中,我们使用Scanner类获取用户输入的表达式,并将其保存在expression变量中。你可以根据实际需求对用户输入进行校验,确保输入的表达式是合法的。

步骤2:将表达式转换为逆波兰表达式

import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        // ...
        String postfixExpression = infixToPostfix(expression);
        // ...
    }
    
    private static String infixToPostfix(String expression) {
        StringBuilder postfix = new StringBuilder();
        Stack<Character> stack = new Stack<>();
        
        for (char c : expression.toCharArray()) {
            if (Character.isDigit(c)) {
                postfix.append(c);
            } else if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                while (!stack.isEmpty() && stack.peek() != '(') {
                    postfix.append(stack.pop());
                }
                stack.pop(); // 弹出左括号
            } else {
                while (!stack.isEmpty() && priority(c) <= priority(stack.peek())) {
                    postfix.append(stack.pop());
                }
                stack.push(c);
            }
        }
        
        while (!stack.isEmpty()) {
            postfix.append(stack.pop());
        }
        
        return postfix.toString();
    }
    
    private static int priority(char operator) {
        if (operator == '+' || operator == '-') {
            return 1;
        } else if (operator == '*' || operator == '/') {
            return 2;
        } else {
            return 0;
        }
    }
}

在这个步骤中,我们使用一个栈来辅助将中缀表达式转换为逆波兰表达式。对于输入的中缀表达式中的每个字符,我们按照运算符优先级的规则进行处理。具体实现中,我们使用StringBuilder来构建逆波兰表达式,使用Stack来保存运算符。

步骤3:计算逆波兰表达式的结果

import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        // ...
        int result = evaluatePostfix(postfixExpression);
        // ...
    }
    
    private static int evaluatePostfix(String postfixExpression) {
        Stack<Integer> stack = new Stack<>();
        
        for (char c : postfixExpression.toCharArray()) {
            if (Character.isDigit(c)) {
                stack.push(Character.getNumericValue(c));
            } else {
                int operand2 = stack.pop();
                int operand1 = stack.pop();
                int result;
                
                switch (c) {
                    case '+':
                        result = operand1 + operand2;
                        break;
                    case '-':
                        result = operand1 - operand2;
                        break;
                    case '*':
                        result = operand1 * operand2;
                        break;
                    case '/':
                        result = operand1 / operand2;
                        break;
                    default:
                        throw new IllegalArgumentException("Invalid operator: " + c);
                }
                
                stack.push(result);
            }
        }
        
        return stack.pop();
    }
}

在这个步骤中,我们利用栈来计算逆波兰表达式的结果。对于逆波兰表达式中的每个字符,如果是数字,则将其转换为整数并入栈;如果是运算符,则从栈中弹出两个操作数进行相应的运算,并将结果入栈。最终,栈中仅剩下一个元素,即