欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂Java培訓(xùn)之計(jì)算器核心算法代碼實(shí)現(xiàn)

2019-01-04 14:49:12 1212瀏覽

今天扣丁學(xué)堂Java培訓(xùn)老師給大家介紹一下關(guān)于Java計(jì)算器核心算法代碼實(shí)現(xiàn)講解,首先在進(jìn)行一個(gè)表達(dá)式的計(jì)算時(shí),先將表達(dá)式分割成數(shù)字和字符串然后利用出入棧將分割后的表達(dá)式進(jìn)行中綴轉(zhuǎn)后綴,再將后綴表達(dá)式進(jìn)行計(jì)算得到結(jié)果(思想在上一篇寫過)現(xiàn)在貼下Java語言的代碼實(shí)現(xiàn)。



我將這部分分成三個(gè)方法完成功能,并在getResult方法調(diào)用(getResult方法被主方法調(diào)用)

private String getResult(String str) {
    //分割
    String[] Str = segment(str);
    //中綴轉(zhuǎn)后綴
    String newStr = infToSuf(Str);
    //后綴計(jì)算
    String result = sufToRes(newStr);
    return sufToRes(result);
  }

1.字符串分割,為避免在TextView上顯示帶空格刪除時(shí)不方便而且顯示屏就那么大占地方,錄入時(shí)的字符串中沒有空格然后就手動分割了

private static String[] segment(String str) {
    String[] exp = new String[str.length()+1];
    //找最近的索引并截取字符串
    int l = str.length();
    for(int i = 0;i < l+1;i++) {
      int index;
      int[] ind = new int[6];
      ind[0] = str.indexOf('+');
      ind[1] = str.indexOf('-');
      ind[2] = str.indexOf('*');
      ind[3] = str.indexOf('/');
      ind[4] = str.indexOf('(');
      ind[5] = str.indexOf(')');
      if(ind[1] == 0) {
        Arrays.sort(ind);
        int t;
        for(t = 0;t <6;t++) {
          if(ind[t] >= 0)
            break;
        }
        int r = ind[t+1];
        exp[i] = str.substring(0,r);
        i++;
        exp[i] = str.substring(r,r+1);
        str = str.substring(r+1);
      }else if(((ind[1]-ind[4]) == 1) && (ind[4]==0)) {
        Arrays.sort(ind);
        int t ;
        for(t = 0;t <6;t++) {
          if(ind[t] >= 0)
            break;
        }
        int r = ind[t+1];
        exp[i] = str.substring(0,1);
        i++;
        exp[i] = str.substring(1,r+2);
        i++;
        exp[i] = str.substring(r+2,r+3);
        str = str.substring(r+3);
      }else {
        Arrays.sort(ind);
        int t;
        for(t = 0;t <6;t++) {
          if(ind[t] >= 0)
            break;
        }
        if(t==6)
          break;
        index = ind[t];
        if(index!=0) {
          exp[i] = str.substring(0,index);
          i++;
        }
        exp[i] = str.substring(index,index+1);
        str = str.substring(index+1);
      }
    }
    int j = 0;
    int k = 0;
    for(; exp[j]!=null ;j++){}
    if(!exp[j-1].equals(")")) {
      exp[j]=str;
      str = "";
      k = j;
    }else {
      k = j-1;
    }
    String[] expp = new String[k+1];
    for(int t = 0; t < k+1;t++) {
      expp[t] = exp[t];
    }
    return expp;
    //System.out.println("分割的字符串:");
  }

2、中綴轉(zhuǎn)后綴

private static String infToSuf(String[] exp) {
    String newStrs = "";
    //初始化棧
    Stack<String> stack = new Stack<>();
     /*
           判斷并放入后綴表達(dá)式中:
       for循環(huán)遍歷整個(gè)str進(jìn)行判斷
           循環(huán)結(jié)束若棧不為空全部出棧
     */
    int l = exp.length;
    for(int i = 0; i < l; i++) {
      if ((stack.empty()) && (exp[i].equals("+") || exp[i].equals("-") || exp[i].equals("*") || exp[i].equals("/"))) {
        stack.push(exp[i]);
      } else if (exp[i].equals("(")) {
        stack.push(exp[i]);
      } else if (exp[i].equals("*") || exp[i].equals("/")) {
        while (stack.peek().equals("*") || stack.peek().equals("/")) {
          newStrs = newStrs.concat(stack.pop()+" ");
          if(stack.isEmpty()) {
            break;
          }
        }
        stack.push(exp[i]);
      } else if (exp[i].equals("+") || exp[i].equals("-")) {
        while (!(stack.isEmpty())&&((stack.peek()).equals("*") || (stack.peek()).equals("/") || (stack.peek()).equals("+") || (stack.peek()).equals("-"))) {
          newStrs = newStrs.concat(stack.pop()+" ");
          if(stack.isEmpty()) {
            break;
          }
        }
        stack.push(exp[i]);
      } else if (exp[i].equals(")")) {
        int t = stack.search("(");
        for (int k = 1; k < t; k++) {
          newStrs = newStrs.concat(stack.pop()+" ");
        }
        String tstr = stack.pop();
      } else {
        newStrs = newStrs.concat(exp[i]+ " ");
      }
    }
    while (!stack.empty()) {
      if (!stack.peek().equals("(") || !stack.peek().equals(")")) {
        newStrs = newStrs.concat(stack.pop()+" ");
      } else if (stack.peek().equals("(") || stack.peek().equals(")")) {
        String tstr = stack.pop();
      }
    }
//   System.out.println("后綴:"+newStrs);
    return newStrs;
  }

3、后綴的計(jì)算

private static String sufToRes(String sufStr) {
  String[] exp = sufStr.split(" ");
  Stack<String> stack = new Stack<>();
  String Res = "";
  for(int i = 0;i < exp.length; i++) {
    if(!exp[i].equals("+") && !exp[i].equals("-") && !exp[i].equals("*") && !exp[i].equals("/")){
      stack.push(exp[i]);
    }else if(exp[i].equals("+")) {
      BigDecimal b2 = new BigDecimal(stack.pop());
      BigDecimal b1 = new BigDecimal(stack.pop());
      BigDecimal b3 = b1.add(b2);
      stack.push(b3.toString());
    }else if(exp[i].equals("-")) {
      BigDecimal b2 = new BigDecimal(stack.pop());
      BigDecimal b1 = new BigDecimal(stack.pop());
      BigDecimal b3 = b1.subtract(b2);
      stack.push(b3.toString());
    }else if(exp[i].equals("*")) {
      BigDecimal b2 = new BigDecimal(stack.pop());
      BigDecimal b1 = new BigDecimal(stack.pop());
      BigDecimal b3 = new BigDecimal(0);
      if(b1.compareTo(BigDecimal.ZERO)== 0|| b2.compareTo(BigDecimal.ZERO) == 0) {
        b3 = BigDecimal.ZERO;
      }else {
        b3 = b1.multiply(b2);
      }
      stack.push(b3.toString());
    }else if(exp[i].equals("/")){
      BigDecimal b2 = new BigDecimal(stack.pop());
      BigDecimal b1 = new BigDecimal(stack.pop());
      BigDecimal b3 = new BigDecimal(0);
      double d1 = b1.doubleValue();
      double d2 = b2.doubleValue();
      if(d1%d2 == 0){
        b3 = (b1.divide(b2));
        stack.push(b3.toString());
      }else {
        b3 = b1.divide(b2,10, RoundingMode.HALF_UP);
        stack.push(b3.toString());
      }
    }
  }
  Res = stack.pop();
  boolean flag = false;
  for (int m = 0; m < Res.length() - 1;m++) {
    if(Res.charAt(m) == '.'){
      flag = true;
    }
  }
  if(flag) {
    for(int m = Res.length()-1;m >= 0;m--) {
      if(Res.charAt(m) == '0'){
      }else {
        Res = Res.substring(0,m+1);
        break;
      }
    }
    if(Res.charAt(Res.length()-1) == '.') {
      Res = Res.substring(0,Res.length()-1);
    }
  }
  return Res;
}


以上就是關(guān)于扣丁學(xué)堂Java培訓(xùn)之計(jì)算器核心算法代碼實(shí)現(xiàn)的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,請關(guān)注扣丁學(xué)堂Java培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺不僅為您提供權(quán)威的Java視頻教程供大家學(xué)習(xí),還精心的準(zhǔn)備了Java從入門到精通開發(fā)實(shí)戰(zhàn)技能,定能讓你學(xué)有所成??鄱W(xué)堂Java技術(shù)交流群:670348138。


扣丁學(xué)堂微信公眾號


【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】


查看更多關(guān)于“Java開發(fā)資訊”的相關(guān)文章>>

標(biāo)簽: Java培訓(xùn) Java視頻教程 Java多線程 Java面試題 Java學(xué)習(xí)視頻 Java開發(fā)

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號-2   Copyright ? 2017 - 2022
返回頂部 返回頂部