首页 > 其他分享 >9.26 周二总结

9.26 周二总结

时间:2023-09-27 23:23:59浏览次数:35  
标签:总结 操作数 ch 9.26 运算符 operandStack 周二 expression operatorStack

以下这段代码是我在进行四则运算程序编写中所学到的处理四则运算判断的方法,内容如下 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("无效的操作符");         }     } } 这段代码是一个简单的算术表达式求值程序,使用栈来处理操作数和运算符。它遵循标准的算术优先级规则,即乘法和除法优先于加法和减法。
程序的工作流程如下:
从左到右遍历输入的算术表达式。
如果字符是数字,则将其解析为一个double类型的操作数,并将其压入操作数栈。
如果字符是左括号,则将其压入运算符栈。
如果字符是右括号,则从运算符栈中弹出运算符,并计算其对应的操作数,直到遇到左括号为止。
如果字符是运算符(加号、减号、乘号或除号),则从运算符栈中弹出所有优先级高于或等于当前运算符的运算符,并计算其对应的操作数。然后将当前运算符压入运算符栈。
如果字符既不是数字、括号也不是运算符,则抛出异常。
最终,当遍历完整个表达式后,操作数栈中应该只剩下一个元素,即表达式的计算结果。
代码中的evaluateTopOperator方法用于计算栈顶运算符对应的操作数。它首先从操作数栈中弹出两个操作数,然后根据栈顶运算符进行相应的计算,并将结果压入操作数栈。

标签:总结,操作数,ch,9.26,运算符,operandStack,周二,expression,operatorStack
From: https://www.cnblogs.com/luoqingci/p/17734631.html

相关文章

  • 每日总结
    javapackagecom.tay;importjava.util.Random;publicclassTest{publicstaticvoidmain(String[]args){//把一个一维数组0-15打乱//然后按照四个一组放到二维数组里//1、定义一个一维数组int[]tempArr={0,1,2,3,4,5,6,7,8......
  • 9.26日记
    #MySQL服务ID,保证整个集群中唯一,默认是1server-id=1#是否只读,1代表只读,0代表读写read-only=0#忽略的数据,指不需要同步的数据库,和下面的一条配置默认如果不配置的话,即复制所有数据库#binlog-ignore-db=mysql#指定同步的数据库#binlog-do-db=db01 mysql>showmasterstatus;+-......
  • 每日总结9.27
    今天过得非常充实而愉快。上午,我度过了三节英语课,这对我来说是一次良好的学习机会。在课堂上,我们学习了新的词汇和语法知识,进行了口语练习,以及阅读了一些有趣的英语文章。这些课程不仅帮助我提高了英语水平,还让我更自信地应对英语考试和沟通交流。下午,我和室友决定放松一下,一起去......
  • 每日总结
    今日收获将《软件构造》的作业进行了完善和更改,总算是改到了自己相对满意的程度;又学习了有关于Hive的相关知识;C#的页面设计又弄了弄;背单词!!!解决了之前一直困惑的问题;明天预计继续背单词!!!(•̀ω•́)y,明天之后就要放假了欸~开始主攻erp去!......
  • 日常记录--day10--2023-9月26日--周二
    日程:今天只有上午有课,7点起床,吃了个早饭去上课,早上第一节数据结构,学习了队列,还讲了相关应用。中午午休一个小时,下午起来干了点别的,完善了之前的代码,晚上7-9点听了下代码随想路,学了会javaweb。学了什么:可恶的Javaweb,复习了数据结构。PS:不想学习,想要成为月饼盒;......
  • 每日总结(visual studio安装)
    VisualStudio安装教程一、官网下载官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 因为是个人学习用途,所以我这里下载的是社区版本。下载下来的是一个.exe文件双击打开后,会加载一些东西。最后出现下面的界面  ......
  • 骗分总结
    暴力[CSP-S2022]数据传输,暴力建边跑dijkstra,44[CSP-S2022]星战,无解+性质分析的暴力,只要每个点有出度,那么就可以无限穿梭,只需要判断出度是否均为\(1\),暴力,还有对于只有\(1,3\)操作,可以用全局变量统计,每次修改\(O(1)\),共70[CSP-S2022]假期计划,暴力枚举四个点,60......
  • 每日总结2023/9/27(mapreduce案例)
    参考例文、MapReduce经典案例实战_mapreduce编程案例-CSDN博客map代码packagecn.com.sise.mapreduce.invertedindex;importjava.io.IOException;importorg.apache.hadoop.io.Text;importorg.apache.hadoop.mapreduce.Reducer;publicclassInvertedIndexReducerext......
  • 9.27每日总结
    功能框架图:通过绘制功能框架图,可以更清晰地了解企业生产管理系统的各个功能模块之间的关系和流程。┌───────────────┐│产品管理│└───────────────┘┌───────────────┐│订单管理│└───────────────┘┌......
  • 2023-2024-1 20231401 《计算机基础与程序设计》第一周学习总结
    作业信息该作业属于2023-2024-1计算机基础与程序设计https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP作业要求在https://www.cnblogs.com/rocedu/p/9577842.html#WEEK01作业目标:加入云班课,参考学习本周学习资源注册博客园账号,加入2022-2023-1-计算机基础与程序设计......