java 四则混合运算 计算器
public class Counter {
/**用递归算法,把括号内的公式算出然后递归
* @param args
*/
public static void calculator (String str){
//System.out.println(str);
//装载到StringBuffer提升效率
StringBuffer cstr= new StringBuffer(str);
//用正则把算式内的剩除符号和数字分组,
Pattern p=Pattern.compile("\\-?[0-9]+(\\.[0-9]+)?|[*/]");
if(cstr.length()==0)System.out.println("请输入计算式");
//找出最后一个括号的坐标
int start=cstr.lastIndexOf("(");
//叛断公式是否还有括号
if(start!=-1){
int end=cstr.indexOf(")",start);
StringBuffer spstr=new StringBuffer( cstr.subSequence(start+1, end));
//删去截去的括号内的基本公式
cstr=cstr.delete(start, end+1);
//正则匹配
Matcher m =p.matcher(spstr);
List numlist=new ArrayList();
//把基本公式的值和乘除符号加入到给组
while(m.find()){
numlist.add(m.group());
}
//调用计算方法并返回结果
StringBuffer str1=count(numlist);
//把结果INSERT到指定位置
cstr=cstr.insert(start, str1);
}else{
//最后一次无括号计算基本公式并打印最终结果
Matcher m =p.matcher(cstr);
List numlist=new ArrayList();
while(m.find()){
numlist.add(m.group());
}
StringBuffer str1=count(numlist);
System.out.println(str1);
return;
}
//递归数组
// System.out.println(cstr);
calculator(new String(cstr));
}
/**
*
* @param list 接收基本公式数组
* @return 返回计算结果字符串
*/
private static StringBuffer count(List list){
// System.out.println(list);
double num = 0;
for (int i = 0; i < list.size(); i++) {
if(list.get(i).equals("*")||list.get(i).equals("/")){
Double d=list.get(i).equals("*")?Double.parseDouble((String) list.get(i-1))*Double.parseDouble((String) list.get(i+1)):Double.parseDouble((String) list.get(i-1))/Double.parseDouble((String) list.get(i+1));
list.add(i-1, d+"");list.remove(i);list.remove(i);list.remove(i);
i=i-1;
}
}
for (int i = 0; i < list.size(); i++) {
num+=Double.parseDouble((String) list.get(i));
}
return new StringBuffer(num+"");
}
public static void main(String[] args) {
calculator("3+2+((5-6)*(-3+3/2)/2)");
}
}
最新文章
- Mac eclipse配置Python环境
- 转: Git远程操作详解 (阮一峰)
- 关于ApplicationPoolIdentity
- 判断jQuery元素是否隐藏
- BeX5学习笔记
- xcode 树形管理 cocos2d-x的资源
- pywin32 安装错误 ImportError: DLL load failed: 不是有效的 Win32 应用程序
- NET中级课--文件,流,序列化1
- UVA 12232 - Exclusive-OR(带权并查集)
- 使用iframe父页面调用子页面和子页面调用父页面的元素与方法
- DevExtreme 学习应用[3]
- Python 学习笔记(一)Python 简介
- UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character &#39;\xee&#39;
- mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
- Linux 相关术语_002
- 细说Redis(一)之 Redis的数据结构与应用场景
- VMWare Workstation虚拟机网卡工作模式及配置方法
- obj-c的优缺点
- OpenStack入门篇(二十二)之实现阿里云VPC的SDN网络
- springMVC入门案例
热门文章
- 【转】安卓必备Java基础
- 【滚动数组】【状压dp】Gym - 100956F - Colored Path
- shell 整理,更新,记录
- 思迅/泰格/科脉/收银软件/商超软件数据库修复解决断电造成损坏的mdb\dat文件SQL数据库 置疑 修复 恢复
- iOS 之 内存检查instrument
- Chrome调试大全
- js原生设计模式——8单例模式之简约版属性样式方法库
- 转对象(含length属性)成数组Array.prototype.slice.call(arguments)
- 【angularjs】【学习心得】路由继续研究篇
- iOS 英语