表达式求值 java

Java实现表达式求值最大化
该博客介绍了如何使用Java解决表达式求值问题,重点在于理解乘法优先级高于加法,以及括号可以改变运算顺序以获取最大值。通过给定3个数a, b, c,目标是构造表达式以最大化计算结果。" 138826599,7337247,GLM数据增强:回译、词替换与Mixup策略详解,"['深度学习', '神经网络', '大数据', '人工智能', '自然语言处理']

题目描述

今天上课,老师教了小易怎么计算加法和乘法,乘法的优先级大于加法,但是如果一个运算加了括号,那么它的优先级是最高的。例如:

1+2*3=7
1*(2+3)=5
1*2*3=6
(1+2)*3=9

现在小易希望你帮他计算给定3个数a,b,c,在它们中间添加"+", "*", "(", ")"符号,能够获得的最大值。

输入描述:

一行三个数a,b,c (1 <= a, b, c <= 10)

输出描述:

能够获得的最大值

示例1

输入

复制

1 2 3

输出

复制

9
import java.util.Scanner;

public class Main {
    /**
     * 由于数据量较小这里模拟出所有的情况即可。
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a, b, c;
        a = scanner.nextInt();
        b = scanner.nextInt();
        c = scanner.nextInt();
        scanner.close();
        int maxResult = Integer.MIN_VALUE;
        for (int k=0; k<2; ++k) {
            for (int i = 0; i < 2; ++i) {
                int temp;
                if (i == 0) {
                    temp = a + b;
                } else {
                    temp = a * b;
                }
                for (int j = 0; j < 2; ++j) {
                    int result;
                    if (j == 0) {
                        result = temp + c;
                    } else {
                        result = temp * c;
                    }
                    if (result>maxResult) {
                        maxResult = result;
                    }
                }
            }
            // 交换ac 的值顺序
            int changeTemp = a;
            a = c;
            c = changeTemp;
        }
        System.out.println(maxResult);
    }
}

 

### Java 中实现表达式求值的方法 在 Java 编程中,可以通过多种方式来实现表达式求值功能。通常情况下,可以分为两个主要部分:将中缀表达式转换为后缀表达式以及对后缀表达式进行求值。 #### 一、中缀表达式转后缀表达式 中缀表达式是人们常用的书写形式(如 `3 + 4 * 2`),而后缀表达式则更适合计算机处理(如 `3 4 2 * +`)。为了简化求值过程,一般先将中缀表达式转化为后缀表达式[^2]。 转化的核心思想基于栈的操作: - 使用一个栈存储运算符。 - 遍历输入的中缀表达式字符串中的每一个字符。 - 如果遇到数字,则直接加入到输出队列;如果遇到运算符,则根据其优先级决定是否弹出栈顶元素并将其放入输出队列。 以下是具体的伪代码逻辑: ```plaintext 初始化一个空栈 optStack 和一个空列表 outputQueue; 对于中缀表达式中的每个标记 token 做以下操作: 如果 token 是操作数,则添加至 outputQueue; 如果 token 是左括号 '(',压入 optStack; 如果 token 是右括号 ')',不断从 optStack 弹出直到遇见对应的 '(' 并丢弃该 '('; 如果 token 是运算符 op1,则当 optStack 的栈顶元素 top 运算符优先级高于等于 op1 时, 不断弹出并将这些运算符加到 outputQueue,最后把 op1 压入 optStack; 全部遍历完成后,依次弹出 optStack 中剩余的所有运算符,并加入到 outputQueue。 ``` #### 二、后缀表达式求值 一旦得到了后缀表达式,就可以通过单个栈结构对其进行高效求值。具体做法如下: - 初始化一个空栈 valueStack。 - 对于后缀表达式中的每一项 item 执行以下操作: - 若 item 是操作数,则将其推入 valueStack。 - 否则,item 应是一个运算符 operator,此时应从 valueStack 弹出两次得到 operand2 和 operand1,执行相应的 operation(operand1, operand2),然后将结果重新压回 valueStack。 - 当整个后缀表达式被处理完毕后,valueStack 中仅剩下一个数值即为最终结果。 下面给出一段完整的 Java 示例代码用于演示上述流程: ```java import java.util.Stack; public class ExpressionEvaluator { private static final String OPERATORS = "+-*/"; public static void main(String[] args) { System.out.println(evaluatePostfixExpression("3 4 2 * +")); // 输出 11.0 } /** * 计算后缀表达式的值 */ public static double evaluatePostfixExpression(String expression) { Stack<Double> stack = new Stack<>(); String[] tokens = expression.split("\\s+"); for (String token : tokens) { if (!OPERATORS.contains(token)) { stack.push(Double.parseDouble(token)); } else { double operand2 = stack.pop(); double operand1 = stack.pop(); switch (token.charAt(0)) { case '+': stack.push(operand1 + operand2); break; case '-': stack.push(operand1 - operand2); break; case '*': stack.push(operand1 * operand2); break; case '/': if (operand2 != 0) { stack.push(operand1 / operand2); } break; } } } return stack.pop(); } } ``` 此程序实现了简单的四则运算支持,能够接受标准格式化的后缀表达式作为输入参数,并返回计算后的浮点型结果[^3]。 ### 注意事项 需要注意的是,在实际应用过程中还需要考虑更多边界条件,比如除零错误检测、非法字符过滤等问题。此外,还可以引入 BigDecimal 来提高精度控制能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值