首页 > 其他分享 >9.28

9.28

时间:2023-10-26 22:35:22浏览次数:27  
标签:operatorStack precedence 9.28 operandStack new expression Stack

import java.util.Stack;

public class ArithmeticExpressionEvaluator {
    public static void main(String[] args) {
        String expression = "11 / (5 * 2)";  // 替换为你的题目字符串

        double result = evaluateArithmeticExpression(expression);
        System.out.println("表达式计算结果: " + result);
    }

    public static double evaluateArithmeticExpression(String expression) {
        // 移除空格
        expression = expression.replaceAll("\\s", "");

        // 定义操作数栈和运算符栈
        Stack<Double> operandStack = new Stack<>();
        Stack<Character> operatorStack = new Stack<>();

        // 定义运算符优先级
        int[] precedence = new int[256];
        precedence['+'] = 1;
        precedence['-'] = 1;
        precedence['*'] = 2;
        precedence['/'] = 2;

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

            if (Character.isDigit(ch)) {
                // 处理操作数
                StringBuilder sb = new StringBuilder();
                while (i < expression.length() && Character.isDigit(expression.charAt(i))) {
                    sb.append(expression.charAt(i));
                    i++;
                }
                i--;
                double operand = Double.parseDouble(sb.toString());
                operandStack.push(operand);
            } else if (ch == '(') {
                // 左括号入栈
                operatorStack.push(ch);
            } else if (ch == ')') {
                // 右括号,弹出括号内的运算符进行计算
                while (!operatorStack.isEmpty() && operatorStack.peek() != '(') {
                    evaluateTopOperator(operandStack, operatorStack);
                }
                if (!operatorStack.isEmpty() && operatorStack.peek() == '(') {
                    operatorStack.pop();  // 弹出左括号
                } else {
                    throw new IllegalArgumentException("括号不匹配");
                }
            } else if (isOperator(ch)) {
                // 处理运算符
                while (!operatorStack.isEmpty() && operatorStack.peek() != '(' &&
                        precedence[ch] <= precedence[operatorStack.peek()]) {
                    evaluateTopOperator(operandStack, operatorStack);
                }
                operatorStack.push(ch);
            } else {
                throw new IllegalArgumentException("无效的字符: " + ch);
            }
        }

        // 处理剩余的运算符
        while (!operatorStack.isEmpty()) {
            evaluateTopOperator(operandStack, operatorStack);
        }

        // 返回最终结果
        if (operandStack.size() == 1 && operatorStack.isEmpty()) {
            return operandStack.pop();
        } else {
            throw new IllegalArgumentException("无效的表达式");
        }
    }

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

    private static void evaluateTopOperator(Stack<Double> operandStack, Stack<Character> operatorStack) {
        if (operandStack.size() < 2 || operatorStack.isEmpty()) {
            throw new IllegalArgumentException("无效的表达式");
        }
        double operand2 = operandStack.pop();
        double operand1 = operandStack.pop();
        char operator = operatorStack.pop();
        double result = performOperation(operand1, operator, operand2);
        operandStack.push(result);
    }

    private static double performOperation(double operand1, char operator, double operand2) {
        switch (operator) {
            case '+':
                return operand1 + operand2;
            case '-':
                return operand1 - operand2;
            case '*':
                return operand1 * operand2;
            case '/':
                if (operand2 != 0) {
                    return operand1 / operand2;
                } else {
                    throw new ArithmeticException("除零错误");
                }
            default:
                throw new IllegalArgumentException("无效的操作符");
        }
    }
}
复制代码 复制代码
这段代码的作用如下:
expression = expression.replaceAll("\\s", "");

这行代码使用正则表达式,将 expression 中的空格字符去除掉。它使用 replaceAll 方法,第一个参数是表示空格字符的正则表达式 "\\s",第二个参数为空字符串 "",表示将空格字符替换为空。
接下来是变量的定义和初始化:
Stack&lt;Double&gt; operandStack = new Stack&lt;&gt;();
Stack&lt;Character&gt; operatorStack = new Stack&lt;&gt;();

这两行代码分别定义并创建了一个操作数栈 operandStack 和一个运算符栈 operatorStack,它们是用来存储计算过程中的操作数和运算符的栈。
int[] precedence = new int[256];
precedence['+'] = 1;
precedence['-'] = 1;
precedence['*'] = 2;
precedence['/'] = 2;

标签:operatorStack,precedence,9.28,operandStack,new,expression,Stack
From: https://www.cnblogs.com/gjsgjs/p/17790619.html

相关文章

  • KubeSphere 社区双周报 | OpenFunction v1.2.0 发布 | 2023.09.15-09.28
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2023.09.15-2023.09.28。贡献者名单新晋KubeSphereCon......
  • 9.28每日总结
    今天是回家的前一天晚上上午我学到了统一建模语言中关于图的定制,学习了乒乓球的姿势下午学习了数据结构中的队列,复习了栈,学习了离散数学中的闭包运算与集合运算晚上学习了营养与健康,收拾东西逃离河北(doge今天我学到了:东西要提前收拾,否则会使人手忙脚乱 ......
  • 9.28-9.30有感
    持续摆烂的3天,不是不想写日记,而是什么事情都没做,不知道写啥,干嘛去了呢,主要是看小说和打游戏,白天就想睡觉,晚上打游戏的恶性循环,晚上没睡好,白天就不想动。手机误人啊。但又很难真的不去看,这就很矛盾......
  • 9.28
    上午,上建模语言和体育课,建模语言学习了类和对象,体育课进行了蓝球练习,下午上了数据结构和离散数学的课,数据结构讲了树的一些定义,以及二叉树,离散数学讲了关系闭包,以及矩阵求传递闭包的方法,晚上收拾东西,准备第二天回家的行李。......
  • 9.28每日总结
     将《软件构造》的作业进行了完善和更改,总算是改到了自己相对满意的程度;又学习了有关于Hive的相关知识;C#的页面设计又弄了弄;背单词!!!解决了之前一直困惑的问题; ......
  • 9.28日
    早上UML统一建模语言学了用例图,乒乓球课继续练习反手击球,进一步规范动作。下午离散学到了集合关系的闭包运算以及集合的划分和覆盖,数据结构则简单讲了二叉树的概念。packagerunoob.binarySearch;/** *二分查找法 */publicclassBinarySearch{  //二分查找......
  • 2023.09.28
    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 示例1:输入:s="()"输出:true示例 2:输入:s="()[]{}"输出:t......
  • 2023.9.28
    今天是在做一道buuctf上的题目,但是过程中遇到了一些困难,写这篇随笔的时候还没能解决,打算明天继续去问学长对了,昨天想试的一些东西试玩了,主要是关于一些调试和libc获取方面的东西在家里学习感觉还是和在学校不一样,感觉在家里学习学着学着就会想躺床上去,在学校嫌爬上爬下的麻烦就......
  • 每日总结——9.28(周四)
    学习工作描述去了熙街吃饭,然后堵了一下午,终于到家了总结与反思前面已经耍了几天了,差不多了明日计划完成黑马点评优化和笔记总结发布......
  • 2023.9.28动手动脑
    1.此代码有什么问题 建造构造类的构造函数,再调用时需要输入传入参数,不能再调用原始类的默认构造。2.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?在静态方法中访问类的实例成员(非静态字段或方法),需要通过实例化类对......