题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

import java.util.Scanner;
import java.util.Stack;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String expression = in.nextLine(); // 读取一行输入作为算术表达式
        int result = evaluate(expression);
        System.out.println(result); // 输出计算结果
    }

    private static int evaluate(String expression) {
        Stack<Integer> values = new Stack<>();
        Stack<Character> operators = new Stack<>();

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

            if (Character.isDigit(ch)) { // 如果是数字,则构建完整的数字
                int temp = i;
                int val = 0;
                while (i < expression.length() && Character.isDigit(expression.charAt(i))) {
                    val = (val * 10) + (expression.charAt(i) - '0');
                    i++;
                }
                values.push(val);
                if(!operators.empty()){
                    if(temp>=2&&expression.charAt(temp-1)=='-'&&(expression.charAt(temp-2)=='(') || temp==1&&expression.charAt(0)=='-'){
                            values.pop();
                            values.push(-val);
                            operators.pop();
                    }
                }
                i--; // 回退一步以考虑运算符或下一个数字
            } else if (ch == '(') { // 如果是左括号,压入操作符栈
                operators.push(ch);
            }  else if (ch == ')') { // 如果是右括号,计算括号内的表达式
                while (!operators.isEmpty() && operators.peek() != '(')
                    values.push(applyOp(operators.pop(), values.pop(), values.pop()));
                operators.pop(); // 移除左括号
            } else if (isOperator(ch)) { // 如果是运算符
                while (!operators.isEmpty() && hasPrecedence(ch, operators.peek()))
                    values.push(applyOp(operators.pop(), values.pop(), values.pop()));
                operators.push(ch);
            }
        }

        while (!operators.empty()) { // 计算剩余的操作
            if (values.empty()) break;
            values.push(applyOp(operators.pop(), values.pop(), values.pop()));
        }

        return values.pop();
    }

    private static boolean isOperator(char ch) {
        return ch == '+' || ch == '-' || ch == '*' || ch == '/';
    }

    private  static boolean isAllOperator(char ch) {
        return ch == '-' || ch == '(';
    }

    private static boolean hasPrecedence(char op1, char op2) {
        if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) {
            return false;
        } else if ((op1 == '+' || op1 == '-') && (op2 == '*' || op2 == '/')) {
            return true;
        } else if (op2 == '(') {
            return false;
        } else {
            return true;
        }
    }

    private static int applyOp(char op, int b, int a) {
        switch (op) {
            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;
    }
}

全部评论

相关推荐

真是做吐了🤮
投递美团等公司10个岗位 >
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务