Java语言怎么用字符串的方式表示一个表达式,并且计算表达式的值是什么

Java语言怎么用字符串的方式表示一个表达式,并且计算表达式的值是什么

http://t.csdn.cn/56V5D

【以下回答由 GPT 生成】

解决方案:

Java中可以使用以下步骤来表示一个字符串的数学表达式,并计算表达式的结果:

  1. 将字符串转换为逆波兰表达式(Reverse Polish Notation,简称RPN),也称为后缀表达式。 RPN的优势是可以使用栈来轻松地计算表达式的结果。具体的转换步骤如下:
  2. 创建一个空栈和一个空字符串结果列表。
  3. 从左到右遍历字符串的每个字符,进行如下处理:
    • 如果遇到数字字符,将连续的数字字符加到一个字符串变量中,直到遇到一个非数字字符。将该数字字符串添加到结果列表中。
    • 如果遇到一个运算符字符(+、-、*、/等),则进行如下处理:
    • 如果栈为空或者栈顶的操作符是左括号(),则将该运算符入栈。
    • 如果运算符的优先级高于栈顶的操作符,则将该运算符入栈。
    • 如果运算符的优先级低于或等于栈顶的操作符,则将栈顶的操作符出栈,并添加到结果列表中,直到栈顶的操作符优先级低于或等于当前运算符,然后将当前运算符入栈。
    • 如果遇到左括号(),将该运算符入栈。
    • 如果遇到右括号(),则进行如下处理:
    • 将栈顶的操作符出栈,并添加到结果列表中,直到遇到左括号为止。将左括号出栈。
  4. 如果字符串遍历完毕,但栈中还有操作符,则将栈中的所有操作符出栈,并添加到结果列表中。

  5. 使用栈和RPN表达式计算结果。

  6. 创建一个空栈。
  7. 遍历结果列表中的每个元素,进行如下处理:
    • 如果当前元素是一个数字,则将其转换为整数并入栈。
    • 如果当前元素是一个运算符,则从栈中弹出两个操作数,执行运算,并将结果入栈。
  8. 遍历完结果列表后,栈中只剩下一个元素,即为表达式的结果。

下面是示例代码来实现上述步骤:

import java.util.*;

public class ExpressionCalculator {
    public static int calculateExpression(String expression) {
        List<String> rpn = convertToRPN(expression);
        return calculateRPN(rpn);
    }

    private static List<String> convertToRPN(String expression) {
        List<String> rpn = new ArrayList<>();
        Stack<String> stack = new Stack<>();

        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);

            if (Character.isDigit(c)) {
                StringBuilder num = new StringBuilder();
                num.append(c);
                while (i + 1 < expression.length() && Character.isDigit(expression.charAt(i + 1))) {
                    num.append(expression.charAt(i + 1));
                    i++;
                }
                rpn.add(num.toString());
            } else if (c == '+' || c == '-' || c == '*' || c == '/') {
                while (!stack.isEmpty() && isHigherPriority(stack.peek(), Character.toString(c))) {
                    rpn.add(stack.pop());
                }
                stack.push(Character.toString(c));
            } else if (c == '(') {
                stack.push(Character.toString(c));
            } else if (c == ')') {
                while (!stack.isEmpty() && !stack.peek().equals("(")) {
                    rpn.add(stack.pop());
                }
                stack.pop();
            }
        }

        while (!stack.isEmpty()) {
            rpn.add(stack.pop());
        }

        return rpn;
    }

    private static boolean isHigherPriority(String operator1, String operator2) {
        if (operator1.equals("*") || operator1.equals("/")) {
            return true;
        } else if (operator1.equals("+") || operator1.equals("-")) {
            return !operator2.equals("*") && !operator2.equals("/");
        }
        return false;
    }

    private static int calculateRPN(List<String> rpn) {
        Stack<Integer> stack = new Stack<>();

        for (String token : rpn) {
            if (Character.isDigit(token.charAt(0))) {
                stack.push(Integer.parseInt(token));
            } else {
                int operand2 = stack.pop();
                int operand1 = stack.pop();
                int result = 0;

                switch (token) {
                    case "+":
                        result = operand1 + operand2;
                        break;
                    case "-":
                        result = operand1 - operand2;
                        break;
                    case "*":
                        result = operand1 * operand2;
                        break;
                    case "/":
                        result = operand1 / operand2;
                        break;
                }

                stack.push(result);
            }
        }

        return stack.pop();
    }

    public static void main(String[] args) {
        String expression = "2 + 3 * 5 - 4";
        int result = calculateExpression(expression);
        System.out.println(result);
    }
}

通过调用calculateExpression方法,传入一个数学表达式的字符串,即可计算出表达式的结果。以上述字符串表达式为例,将输出结果为13。

我希望这个解决方案对你有帮助。如果你有任何疑问,请随时追问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

可以 采用 栈 这种数据结构 来做

如 “1+2*3”

一、构建后缀表达式
构建的过程及原理就是:构建一个操作符栈,和一个后缀式栈,如果是数字则直接入后缀式栈。如果是操作符,即入操作符栈,比较当前操作符与栈顶操作符的运算优先级,

若优先级低于当前栈顶元素。即把所有优先级不小于当前操作符的站内元素出栈并加入到后缀式栈。其中比较特殊的是‘(’和‘)’。左括弧的运算级别忽略,但同时也作为栈内元素出栈的分界点。即假如栈内为( + * ,现在的操作符为-时,仅将、+出栈,而(与*保留。直到遇到‘)’时将栈内直到‘(’的元素全部出栈。

二、将栈内元素翻转。依次加入到结果栈内,若为数字直接加入。遇到操作符即从结果栈内取出两个元素操作完后加入结果栈。最后即可得到结果。