实现Java四则混合运算

在学习编程的过程中,实现一个简单的混合四则运算器是一个非常有趣的项目。这个项目能够帮助你理解基本的运算符、字符串处理以及引入条件判断。接下来,我将为你提供一个清晰的流程和代码示例,帮助你理解如何实现这个项目。

流程概述

下面是实现四则混合运算的主要步骤:

步骤 说明
1. 用户输入表达式 接收用户输入的数学表达式
2. 解析表达式 将输入的字符串解析为数字和运算符
3. 计算结果 根据运算符进行计算,并处理优先级
4. 输出结果 将计算结果输出到用户界面

以下是用Mermaid语法表示的流程图:

flowchart TD
    A[用户输入表达式] --> B[解析表达式]
    B --> C[计算结果]
    C --> D[输出结果]

每一步的详细说明及代码

1. 用户输入表达式

我们首先需要接收用户输入的数学表达式。可以使用 Scanner 类来处理用户输入。

import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入数学表达式(例如:3 + 5 * 2):");
        String input = scanner.nextLine(); // 接收用户输入
        // 后续步骤...
    }
}

2. 解析表达式

解析输入字符串并将其分割为数字和运算符,可以使用正则表达式。

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Calculator {
    // ...前面的代码...
    
    private static List<String> parseInput(String input) {
        List<String> parsedInput = new ArrayList<>();
        Matcher matcher = Pattern.compile("\\d+(\\.\\d+)?|[+\\-*/()]").matcher(input);
        
        while (matcher.find()) {
            parsedInput.add(matcher.group()); // 将数字和运算符添加到列表
        }
        return parsedInput;
    }
}

3. 计算结果

在这一步,我们根据运算符进行计算。在处理优先级的情况下,我们可以使用两个栈:一个栈存放数字,一个栈存放运算符。

private static double evaluate(List<String> tokens) {
    Stack<Double> numbers = new Stack<>();
    Stack<String> operators = new Stack<>();

    for (String token : tokens) {
        if (token.matches("\\d+(\\.\\d+)?")) { // 判断是否为数字
            numbers.push(Double.parseDouble(token));
        } else {
            // 处理运算符...
            while (!operators.isEmpty() && precedence(operators.peek()) >= precedence(token)) {
                // 进行计算
                double b = numbers.pop();
                double a = numbers.pop();
                String operator = operators.pop();
                numbers.push(applyOperation(a, b, operator));
            }
            operators.push(token); // 将运算符推入栈中
        }
    }
    
    // 最后计算剩余的运算符
    while (!operators.isEmpty()) {
        double b = numbers.pop();
        double a = numbers.pop();
        String operator = operators.pop();
        numbers.push(applyOperation(a, b, operator));
    }

    return numbers.pop(); // 返回最终结果
}

private static int precedence(String operator) {
    if (operator.equals("+") || operator.equals("-")) return 1;
    if (operator.equals("*") || operator.equals("/")) return 2;
    return 0;
}

private static double applyOperation(double a, double b, String operator) {
    switch (operator) {
        case "+" -> {
            return a + b;
        }
        case "-" -> {
            return a - b;
        }
        case "*" -> {
            return a * b;
        }
        case "/" -> {
            if (b == 0) throw new UnsupportedOperationException("Cannot divide by zero");
            return a / b;
        }
    }
    return 0;
}

4. 输出结果

最后,我们将计算结果输出到用户界面。

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入数学表达式(例如:3 + 5 * 2):");
    String input = scanner.nextLine();
    
    List<String> tokens = parseInput(input); // 解析输入
    double result = evaluate(tokens); // 计算结果
    System.out.println("计算结果为:" + result); // 输出结果
}

饼状图示例

最后,想象一下,如果我们将各个运算符计算的数量用饼状图表示,可以用以下Mermaid代码:

pie
    title 运算符使用情况
    "加法": 40
    "减法": 30
    "乘法": 20
    "除法": 10

结尾

通过以上步骤,我们实现了一个简单的四则混合运算器。你不仅学会了如何解析字符串、处理数据结构,还掌握了运算符的优先级管理。这个项目能帮助你在编程的道路上打下坚实的基础,继续探索更复杂的算法和数据结构吧!希望这篇文章对你有所帮助。