A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我想问一下怎样实现%,开根号等这种运算符运算啊,我是传入str字符串,str就是混合运算公式,我是运用栈实现运算的,可是如果综合式子里出现%,开根号什么的我就不太清楚符号和数字该怎样出栈才会正确了,求帮助!例如str=“1+(√4*(3/1+2))=”
  1. package com.song.computer.calculate;

  2. import java.util.LinkedList;
  3. import java.util.List;

  4. /**
  5. * 刘松 calculate.java
  6. *
  7. * @author song 功能:1.实现加减乘除的方法 2.运算符的优先级比较
  8. *
  9. */

  10. public class Calculate {

  11.         private static int nowSyst = 10;// 表示使用的进制形式
  12.         private List<String> numbers = new LinkedList<String>();
  13.         private List<String> opers = new LinkedList<String>();

  14.         public Calculate() {

  15.         }

  16.         // 处理字符计算方法
  17.         private String calculateNumbers(String str) throws Exception {
  18.                 int i = 0;
  19.                 String r = "";
  20.                 String num = "";
  21.                 while (i < str.length()) {
  22.                         String s = String.valueOf(str.charAt(i));
  23.                         if (s.equals("(")) {
  24.                                 processOper(s, num);
  25.                         } else if (s.equals(")")) {
  26.                                 processOper(s, num);
  27.                                 num = "";
  28.                         } else if (s.equals("*")) {
  29.                                 processOper(s, num);
  30.                                 num = "";
  31.                         } else if (s.equals("/")) {
  32.                                 processOper(s, num);
  33.                                 num = "";
  34.                         } else if (s.equals("+")) {
  35.                                 processOper(s, num);
  36.                                 num = "";
  37.                         } else if (s.equals("-")) {
  38.                                 processOper(s, num);
  39.                                 num = "";
  40.                         } else if (s.equals("%")) {

  41.                         } else if (s.equals("^")) {

  42.                         } else if (s.equals("√")) {

  43.                         } else if (s.equals("=")) {
  44.                                 processOper(s, num);
  45.                                 r = numbers.remove(numbers.size() - 1);
  46.                                 num = "";
  47.                         } else {
  48.                                 num += s;
  49.                         }
  50.                         i++;
  51.                 }
  52.                 return r;
  53.         }

  54.         // 得到运算符后的处理方法
  55.         /**
  56.          * @param op        运算符
  57.          * @param num        数值
  58.          * @throws Exception        抛出无法计算的异常
  59.          */
  60.         private void processOper(String op, String num) throws Exception {
  61.                 if (num != "") {
  62.                         if (nowSyst != 10) {       
  63.                                 num = changeSystem(nowSyst, 10, num);
  64.                         }
  65.                         numbers.add(num);
  66.                 }
  67.                 if (opers.isEmpty()) {
  68.                         opers.add(op);
  69.                 } else {
  70.                         String chr = opers.get(opers.size() - 1);
  71.                         //如果当前符号的优先级小于容器里最后一个符号的优先级,则进行运算否则把否号放入容器
  72.                         while (!getPriority(op, chr)) {
  73.                                 if (")".equals(op) && "(".equals(chr)) {
  74.                                         opers.remove(opers.size() - 1);
  75.                                         break;
  76.                                 }
  77.                                 double m = Double.valueOf(numbers.remove(numbers.size() - 1));
  78.                                 double n = Double.valueOf(numbers.remove(numbers.size() - 1));
  79.                                 CalculateAction cal = new CalculateAction();
  80.                                 double sum = cal.resultSum(n, m, chr);
  81.                                 opers.remove(opers.size() - 1);
  82.                                 numbers.add(String.valueOf(sum));
  83.                                 if (opers.isEmpty()) {
  84.                                         break;
  85.                                 }
  86.                                 chr = opers.get(opers.size() - 1);
  87.                         }
  88.                         if (!"=".equals(op) && !")".equals(op)) {
  89.                                 opers.add(op);
  90.                         }
  91.                 }
  92.         }

  93.         // 优先级比较
  94.         /**
  95.          * @param op1        运算符1
  96.          * @param op2        运算符2
  97.          * @return        返还优先级的比较结果,boolean值
  98.          */
  99.         private boolean getPriority(String op1, String op2) {
  100.                 if (!")".equals(op1) && "(".equals(op2)) {
  101.                         return true;
  102.                 } else if ("(".equals(op1) && !"(".equals(op2)) {
  103.                         return true;
  104.                 } else if (("*".equals(op1) || "/".equals(op1)) && !"(".equals(op2)
  105.                                 && !"*".equals(op2) && !"/".equals(op2)) {
  106.                         return true;
  107.                 } else if (("+".equals(op1) || "-".equals(op1))
  108.                                 && ("=".equals(op2) || ")".equals(op2))) {
  109.                         return true;
  110.                 } else if (")".equals(op1) && "=".equals(op2)) {
  111.                         return true;
  112.                 } else if ("=".equals(op1) && op2 == null) {
  113.                         return true;
  114.                 }
  115.                 return false;
  116.         }

  117.         // 进制转换
  118.         /**
  119.          *
  120.          * @param s1
  121.          *            数值的当前进制
  122.          * @param s2想要转换成的进制
  123.          * @param num
  124.          *            要转换进制的数值
  125.          * @return 返回转换后的数值
  126.          */
  127.         public String changeSystem(int s1, int s2, String num) {
  128.                 if (num.indexOf(".") == -1) { // 数值中没有小数时
  129.                         int part = Integer.valueOf(num, s1);
  130.                         return Integer.toString(part, s2);
  131.                 } else {
  132.                         String[] nums = num.split("\\.");// 有小数时
  133.                         int intPart = 0;
  134.                         int decPart = 0;
  135.                         intPart = Integer.valueOf(nums[0], s1);
  136.                         decPart = Integer.valueOf(nums[1], s1);
  137.                         String qstr = Integer.toString(intPart, s2);
  138.                         String hstr = Integer.toString(decPart, s2);
  139.                         return qstr + "." + hstr;
  140.                 }
  141.         }

  142.         /**
  143.          *
  144.          * @param str
  145.          *            计算式的字符串
  146.          * @return 返还计算后的结果
  147.          * @throws Exception
  148.          *             抛出无法计算式的异常
  149.          */
  150.         public String getResult(String str) throws Exception {
  151.                 String r;
  152.                 r = calculateNumbers(str);
  153.                 if (nowSyst != 10) {
  154.                         r = changeSystem(10, nowSyst, r);
  155.                 }
  156.                 return r==""? "0":r;
  157.         }

  158.         // 得到进制形式
  159.         public void setSyst(int syst) {
  160.                 nowSyst = syst;
  161.         }

  162.         // 返回进制形式
  163.         public int getSyst() {
  164.                 return nowSyst;
  165.         }
  166. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

4 个回复

正序浏览
刘松703 发表于 2013-12-20 22:42
都是人啊哈哈哪能没有问题的我也是菜鸟啊

不是吧,看你样子觉得挺牛的
回复 使用道具 举报
黄伟财 发表于 2013-12-20 20:18
老见你回复,想不到你也有问题解决不了的

都是人啊哈哈哪能没有问题的我也是菜鸟啊
回复 使用道具 举报
老见你回复,想不到你也有问题解决不了的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马