简介:
最近在做一个计算器,遇到了很多问题,也很有收获,一路从IO读写文档走来,感触很深。
(一)java计算器之逆波兰表达式
需要实现简单的加减乘除以及括号等,说道四则运算,就不得不说一下逆波兰表达式,这是一种有趣的后缀表达式,它将我们生活中常见的
二元计算式(中缀表达式,如1+2),转变为后缀表达式(12+),方便计算机识别和优化计算等。
比如说 a+(b-c)*d ---> a,b,c,-,d,*,+
逆波兰表达式推荐看看:
(2) 逆波兰表达式
(3)java解析四则混合运算表达式并计算结果(具体实现)(栈和 逆波兰表达式实现)
(二)java计算器之不需要逆波兰表达式
不过波兰这两个字怎么看都难看,不想要,介绍个没有用到逆波兰表达式的。
地址:http://blog.csdn.net/zmx729618/article/details/52328377
(1)java实现混合四则运算(采用栈和运算符优先级)
(2)JAVA实现简单四则混合运算(采用String.indexOf("+")、substring()和递归来实现简单的加减乘除)
源地址1:http://www.oschina.net/code/snippet_189899_36597
转载地址2:http://blog.csdn.net/su12345su/article/details/48491849
(三)测试改进等
于是我采用了二.2中的算法,主要是看着简单,我将Float改成Double,因为有的数很大,比如说10000的阶乘什么的,就很难算。
代码如下:
/***
* 主要是基本数据类型的带优先级的加减乘除的四则运算,
* 调用 float opt(String s)就可以了
* **/
public static Double opt(String words) throws Exception{
if(words == null || "".equals(words.trim())) {
return 0.0;
}
int a1 = words.indexOf("+");
// 寻找第一个加号
int a2 = words.indexOf("-");
int a3 = words.indexOf("*");
int a4 = words.indexOf("/");
int a5 = words.indexOf("(");
if(a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1){
if(words.trim() == null || "".equals(words.trim())){
throw new Exception("operate error");
}
return Double.parseDouble(words.trim());
}
if(a5 != -1){
int a6 = words.indexOf(")");
if(a6 == -1){
throw new Exception("括号不匹配");
}else{
Double f = opt(words.substring(a5 + 1, a6).trim());
words = words.replace(words.substring(a5, a6 + 1), String.valueOf(f));
return opt(words);
}
}
if(a1 != -1){
// 加上加号后面的
return opt(words.substring(0, a1)) + opt(words.substring(a1 + 1, words.length()));
}
if(a2 != -1){
// 减去减号后面的
return opt(words.substring(0, a2)) - opt(words.substring(a2 + 1, words.length()));
}
if(a3 != -1){
// 乘上乘号后面的
return opt(words.substring(0, a3))*opt(words.substring(a3 + 1, words.length()));
}
if(a4 != -1){
// 除以除号后面的
return opt(words.substring(0, a4)) / opt(words.substring(a4 + 1, words.length()));
}
return Double.parseDouble(words.trim());
}
希望对你有所帮助!