算式表达式
来源:互联网 发布:淘宝云客服登录网址 编辑:程序博客网 时间:2024/06/05 22:59
输入一个由数字、+,-,*,/ 组成的算术表达式,求其值
输入:正整数
输出:保留两位小数
example:
1+3*6-4/2
17
1+2*2*2-4*2/2*2+1
2
import java.util.Scanner;public class formulaExpress { public static void main(String[] args){//表达式java实现//终于能AC,数不清调试了多少回 Scanner sc= new Scanner(System.in); int count=0; int length=0; String s=sc.nextLine();//只讨论正数情况 String[] a=s.split("\\p{Punct}"); String []b=new String[a.length-1];//长度为操作数减一 //String[] b=s.split("\\p{Alnum}");//有空字符串//空字符串删除,前移 //String c=b[0];//不知道截取的是什么,不过可以用c保存下来//b0与b2居然不一样//只能换思路了 for(int i=0;i<a.length-1;i++){ length+=a[i].length(); b[i]=s.substring(length+i,length+i+1);//试了三遍终于出来了啊啊啊,借助a[i]长度 } //改进:连乘问题(i--),连乘除,放在一起,保持同级关系// for(int i=0;i<b.length;i++) { //截取的字符串与手动表示的不一样,醉了//保存吧,可能是“+”特殊,spilt需转义 if("*".equals(b[i])||"/".equals(b[i])) { if ("*".equals(b[i])) {//等于号不匹配,我绝招都寄出来了,忧伤 double product = Double.parseDouble(a[i]) * (Double.parseDouble(a[i + 1])); a[i] = String.valueOf(product); for (int j = i; j < b.length; j++) { if (j + 2 < a.length) { a[j + 1] = a[j + 2]; b[j] = b[j + 1]; } else { a[a.length - 1] = "0";//让本该删掉尾数无法匹配 b[b.length - 1] = "#"; } } count++; i--;//解决连乘 // return;//退出当前循环语句 } else if ("/".equals(b[i])) { double product = Double.parseDouble(a[i]) / (Double.parseDouble(a[i + 1])); a[i] = String.valueOf(product); for (int j = i; j < b.length; j++) { if (j + 2 < a.length) { a[j + 1] = a[j + 2]; b[j] = b[j + 1]; } else { a[a.length - 1] = "0";//让本该删掉尾数无法匹配 b[b.length - 1] = "#"; } } count++; i--; } } } for(int i=0;i<b.length-count;i++){//加减法采取从左往右的算法,碰到一个就计算一个//加减法不需要移动,乘除法或有优先级的才移 // 在外面有优先级的//类比上面也可以放在一个for(同级运算符) if("-".equals(b[i])||"+".equals(b[i])) { if("+".equals(b[i])){ double product = Double.parseDouble(a[0]) + (Double.parseDouble(a[i + 1]) ); a[0]=String.valueOf(product);//运算结果存在a[0]里 //不需要移动,因而不需要计数器 } else if ("-".equals(b[i])){ double product = Double.parseDouble(a[0]) - (Double.parseDouble(a[i + 1]) ); a[0]=String.valueOf(product); } } } // // if(count==b.length)//存在加减法就< System.out.printf("%.2f",Double.parseDouble(a[0])); }}
以前数据结构没学好,现在终于明白了,细节挺多,就是一开始没仔细想,后来调试到快懵逼的程度,才AC,也怪样例太容易通过,哼
这是用java实现的,并没有用栈,下次讨论更复杂的情况会用到并发下博客的,希望我的做法能对有疑惑的小伙伴提供帮助
阅读全文
0 0
- 算式表达式
- JAVA 计算算式表达式
- 算式表达式的实现
- 算式表达式计算 java实现
- 堆栈-直接-计算中缀算式表达式
- 算式表达式(不转化逆波兰)
- 算式
- 将浮点型算式的中缀表达式转换成后缀表达式并算出式子结果
- 算式类型字符串表达式读取并计算出结果(简单四则运算)--后缀表达式计算
- 算式计算
- 计算式
- 算式计算
- 古堡算式
- 趣味算式
- 猜算式
- 古堡算式
- 古堡算式
- 趣味算式
- SpringMVC源码分析(二)从框架设计说起
- K-MEANS算法
- 如何使用Dockerfile构建Docker镜像
- UDP通信
- java夯实基础-运算符
- 算式表达式
- mpls vpn
- Java并发之AQS详解
- Redis 键(key)
- MySQL之where查询
- Vue.js 自定义指令
- Flink源码解析之 --- 启动流程
- Ubuntu下安装Elasticsearch并同步MySQL数据
- !手把手教你实现一个完整的 Promise