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)");

}

}

最新文章

  1. Mac eclipse配置Python环境
  2. 转: Git远程操作详解 (阮一峰)
  3. 关于ApplicationPoolIdentity
  4. 判断jQuery元素是否隐藏
  5. BeX5学习笔记
  6. xcode 树形管理 cocos2d-x的资源
  7. pywin32 安装错误 ImportError: DLL load failed: 不是有效的 Win32 应用程序
  8. NET中级课--文件,流,序列化1
  9. UVA 12232 - Exclusive-OR(带权并查集)
  10. 使用iframe父页面调用子页面和子页面调用父页面的元素与方法
  11. DevExtreme 学习应用[3]
  12. Python 学习笔记(一)Python 简介
  13. UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character &#39;\xee&#39;
  14. mysql 开发进阶篇系列 10 锁问题 (相同索引键值或同一行或间隙锁的冲突)
  15. Linux 相关术语_002
  16. 细说Redis(一)之 Redis的数据结构与应用场景
  17. VMWare Workstation虚拟机网卡工作模式及配置方法
  18. obj-c的优缺点
  19. OpenStack入门篇(二十二)之实现阿里云VPC的SDN网络
  20. springMVC入门案例

热门文章

  1. 【转】安卓必备Java基础
  2. 【滚动数组】【状压dp】Gym - 100956F - Colored Path
  3. shell 整理,更新,记录
  4. 思迅/泰格/科脉/收银软件/商超软件数据库修复解决断电造成损坏的mdb\dat文件SQL数据库 置疑 修复 恢复
  5. iOS 之 内存检查instrument
  6. Chrome调试大全
  7. js原生设计模式——8单例模式之简约版属性样式方法库
  8. 转对象(含length属性)成数组Array.prototype.slice.call(arguments)
  9. 【angularjs】【学习心得】路由继续研究篇
  10. iOS 英语