From 2b6717e350ca87f64cfdb5518ee5ac8d2eb12e65 Mon Sep 17 00:00:00 2001 From: hnu202326010302 <1677625723@qq.com> Date: Sat, 27 Sep 2025 16:40:59 +0800 Subject: [PATCH] ADD file via upload --- src/Expressionjurge.java | 96 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 src/Expressionjurge.java diff --git a/src/Expressionjurge.java b/src/Expressionjurge.java new file mode 100644 index 0000000..dfae5f4 --- /dev/null +++ b/src/Expressionjurge.java @@ -0,0 +1,96 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; +import java.util.Map; +import java.util.HashMap; + +public class Expressionjurge { + + public boolean hasError(String expression) { + try { + String cleanExpr = expression.replaceAll("\\s+", ""); + List rpn = infixToRPN(cleanExpr); + return evaluateRPN(rpn); + } catch (Exception e) { + return true; // 任何异常都视为有错误 + } + } + + private static List infixToRPN(String expression) { + List output = new ArrayList<>(); + Stack operators = new Stack<>(); + StringBuilder number = new StringBuilder(); + Map precedence = Map.of('+', 1, '-', 1, '*', 2, '/', 2); + for (int i = 0; i < expression.length(); i++) { + char c = expression.charAt(i); + if (Character.isDigit(c) || c == '.') { + number.append(c); + } else { + if (number.length() > 0) { + output.add(Double.parseDouble(number.toString())); + number = new StringBuilder(); + } + if (c == '(') { + operators.push(c); + } else if (c == ')') { + while (!operators.isEmpty() && operators.peek() != '(') { + output.add(operators.pop()); + } + if (!operators.isEmpty()) operators.pop(); + } else if (isOperator(c)) { + while (!operators.isEmpty() && operators.peek() != '(' && + precedence.getOrDefault(operators.peek(), 0) >= precedence.get(c)) { + output.add(operators.pop()); + } + operators.push(c); + } + } + } + if (number.length() > 0) { + output.add(Double.parseDouble(number.toString())); + } + while (!operators.isEmpty()) { + output.add(operators.pop()); + } + return output; + } + + private static boolean evaluateRPN(List rpn) { + Stack stack = new Stack<>(); + + for (Object token : rpn) { + if (token instanceof Double) { + stack.push((Double) token); + } else { + char operator = (Character) token; + if (stack.size() < 2) return true; // 表达式错误 + + double b = stack.pop(); + double a = stack.pop(); + double result; + + switch (operator) { + case '+': result = a + b; break; + case '-': + result = a - b; + if (result < 0) return true; // 发现负数 + break; + case '*': result = a * b; break; + case '/': + if (b == 0) return true; // 发现除零 + result = a / b; + if (result < 0) return true; // 发现负数 + break; + default: return true; // 未知运算符 + } + stack.push(result); + } + } + + return stack.size() != 1; // 如果栈中不是恰好一个元素,说明表达式错误 + } + + private static boolean isOperator(char c) { + return c == '+' || c == '-' || c == '*' || c == '/'; + } +} \ No newline at end of file