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

}

}

java 四则混合运算 计算器的更多相关文章

  1. 用C++实现的有理数(分数)四则混合运算计算器

    实现目标 用C++实现下图所示的一个console程序: 其中: 1.加减乘除四种运算符号分别用+.-.*./表示, + 和 - 还分别用于表示正号和负号. 2.分数的分子和分母以符号 / 分隔. 3 ...

  2. 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)

    记得上<数据结构>课程时,利用栈的特性解决过四则混合运算表达式.而如今在编写小型关系数据库的时候,编译部分要处理where后面的逻辑表达式——检查语法正确与否的同时,还要将信息传给下一个接 ...

  3. java 解析四则混合运算表达式并计算结果

    package ch8; import java.util.LinkedList; import java.util.List; import java.util.Stack; /** * 四则混合运 ...

  4. 软件工程学习之小学四则混合运算出题软件 Version 1.00 设计思路及感想

    对于小学四则混合运算出题软件的设计,通过分析设计要求,我觉得为了这个软件在今后便于功能上的扩充,可以利用上学期所学习的<编译原理>一课中的LL1语法分析及制导翻译的算法来实现.这样做的好处 ...

  5. MathExamV2.0四则混合运算计算题生成器

    MathExamV2.0四则混合运算计算题生成器----211606360 丁培晖 211606343 杨宇潇 一.预估与实际 PSP2.1 Personal Software Process Sta ...

  6. C语言编程学习:写的秒速计算四则混合运算项目

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  7. 数据结构之栈—强大的四则复杂运算计算器(超过windows自带的科学计算器)【中缀转后缀表达式】

    比windows自带计算器还强的四则复杂运算计算器! 实测随机打出两组复杂算式:-7.5 * 6 / ( -2 + ( -6.5 -  -5.22 ) )与7.5+-3*8/(7+2) windows ...

  8. 软件工程学习之小学四则混合运算出题软件 Version 1.1 设计思路及感想

    继上次采用形式文法来生成混合运算的算式,由于算法中没有引入控制参数而导致容易产生形式累赘(多余的括号等)的算式.本次更新决定采用一种更为简单有效的生成方式,由给出的一个随机的最终答案S,通过给定的一个 ...

  9. 带括号的四则混合运算的算符优先算法-----java实现

    1:主方法 package com.baidu; import java.text.NumberFormat;import java.util.ArrayList;import java.util.S ...

随机推荐

  1. 我推荐的一些iOS开发书单

    文/叶孤城___(简书作者)原文链接:http://www.jianshu.com/p/2fa080673842著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 上次发了一下比较不错的i ...

  2. iOS开发之圆角指定 分类: ios技术 2015-05-25 16:26 191人阅读 评论(0) 收藏

    如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某几个角(小于4)为圆角而别的不变时 ...

  3. 基于libUSB的USB设备固件更新程序(下载数据)(转)

    源:基于libUSB的USB设备固件更新程序(下载数据) 本文紧接上一篇日志:基于libUSB-Win32的USB设备固件更新程序(前言),相关背景以及起因等,此处不再赘述,如感兴趣请移步. libU ...

  4. IOS开发-UI学习-沙盒机制&文件操作

    ž苹果为软件的运行提供了一个沙盒机制 每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件 žDocuments:苹果建议将程序中 ...

  5. android 菜单的总结

    安卓菜单有三种菜单. 选项菜单: 点击系统菜单按钮会触发 上下文菜单:长按屏幕触发 子菜单:某一个菜单的下一级菜单 具体的描叙:http://blog.csdn.net/zqiang_55/artic ...

  6. Mybatis学习(6)动态加载、一二级缓存

    一.动态加载: resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: 如 ...

  7. 让win7安装时出现版本选项

    win7有几种版本,win7旗舰版包含各大版本,修改一下ISO,让安装时出现版本选项窗口: 1.准备好一个官方win7旗舰版安装包IOS光盘镜像. 2.用UltraISO打开光盘镜像并删除source ...

  8. 前端开发 Grunt 之 Connect详解

    在前端开发过程中,我们需要在开发过程中,将开发中的站点部署到服务器上,然后,在浏览器中查看实际的效果,在 Grunt 环境下,可以直接使用集成在 Grunt 中的 Connect 插件完成站点服务器的 ...

  9. phpcms v9文章页调用点击量方法

    1.在页面加载" 2.调用统计点击的标签:: 3.最后,在写上这一句:" phpcms v9增加文章随机点击数的方法 找到文件count.php(网站根目录/api) 查找第50行 ...

  10. IE6中让png的icon图标也透明的完整代码段

    一个引用了在IE6中让img图标也可引用png图片的js插件代码的html是这样写的,兼容IE6: <a class="btn btn-select" href=" ...