Java实现输入字符串四则运算

1. 流程图

stateDiagram
    [*] --> 输入表达式
    输入表达式 --> 判断表达式合法性
    判断表达式合法性 --> 解析表达式
    解析表达式 --> 转化为逆波兰表达式
    转化为逆波兰表达式 --> 计算逆波兰表达式的值
    计算逆波兰表达式的值 --> 输出结果

2. 详细步骤

2.1 输入表达式

首先,我们需要从用户那里获取一个待解析的数学表达式。可以使用Java的Scanner类来实现输入操作。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个数学表达式:");
        String expression = scanner.nextLine();
        scanner.close();

        // 执行下一步
    }
}

2.2 判断表达式合法性

在进行计算之前,我们需要判断用户输入的表达式是否合法。可以通过正则表达式来判断表达式是否符合四则运算的规则。

// 使用正则表达式匹配合法的四则运算表达式
if (!expression.matches("[0-9+\\-*/()\\s]+")) {
    System.out.println("输入的表达式不合法!");
    return;
}

// 执行下一步

2.3 解析表达式

接下来,我们需要将用户输入的表达式进行解析,将其中的数字和运算符分离出来。

// 去除空格
expression = expression.replaceAll("\\s", "");

// 将表达式按照运算符分割成字符串数组
String[] tokens = expression.split("(?<=[-+*/()])|(?=[-+*/()])");

// 执行下一步

2.4 转化为逆波兰表达式

将中缀表达式转化为逆波兰表达式是为了方便计算。我们可以使用栈来实现这一步骤。

import java.util.Stack;

public class Main {
    // ...

    // 判断运算符的优先级
    private static int getPriority(char operator) {
        switch (operator) {
            case '+':
            case '-':
                return 1;
            case '*':
            case '/':
                return 2;
            default:
                return 0;
        }
    }

    // 转化为逆波兰表达式
    private static String toPostfix(String[] tokens) {
        StringBuilder postfix = new StringBuilder();
        Stack<Character> stack = new Stack<>();

        for (String token : tokens) {
            char c = token.charAt(0);
            if (Character.isDigit(c)) {
                postfix.append(token).append(" ");
            } else if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                while (!stack.isEmpty() && stack.peek() != '(') {
                    postfix.append(stack.pop()).append(" ");
                }
                stack.pop();
            } else {
                while (!stack.isEmpty() && getPriority(stack.peek()) >= getPriority(c)) {
                    postfix.append(stack.pop()).append(" ");
                }
                stack.push(c);
            }
        }

        while (!stack.isEmpty()) {
            postfix.append(stack.pop()).append(" ");
        }

        return postfix.toString().trim();
    }

    public static void main(String[] args) {
        // ...

        String postfix = toPostfix(tokens);

        // 执行下一步
    }
}

2.5 计算逆波兰表达式的值

最后,我们需要计算逆波兰表达式的值。同样使用栈来实现这一步骤。

// 计算逆波兰表达式的值
private static double evaluatePostfix(String postfix) {
    Stack<Double> stack = new Stack<>();

    for (String token : postfix.split("\\s")) {
        if (token.matches("[0-9]+")) {
            stack.push(Double.valueOf(token));
        } else {
            double b = stack.pop();
            double a = stack.pop();
            switch (token) {
                case "+":
                    stack.push(a + b);
                    break;
                case "-":
                    stack.push(a - b);
                    break;
                case "*":
                    stack.push(a * b);
                    break;
                case "/":
                    stack.push(a / b);
                    break;
            }
        }
    }

    return