最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java計(jì)算器核心算法代碼實(shí)現(xiàn)

 更新時(shí)間:2019年01月03日 14:56:25   作者:sdr_zd  
今天小編就為大家分享一篇關(guān)于Java計(jì)算器核心算法代碼實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

在進(jìn)行一個(gè)表達(dá)式的計(jì)算時(shí),先將表達(dá)式分割成數(shù)字和字符串然后利用出入棧將分割后的表達(dá)式進(jìn)行中綴轉(zhuǎn)后綴,再將后綴表達(dá)式進(jìn)行計(jì)算得到結(jié)果(思想在上一篇寫(xiě)過(guò))現(xiàn)在貼下Java語(yǔ)言的代碼實(shí)現(xiàn)。(學(xué)習(xí)Java時(shí)間不長(zhǎng)所以可能會(huì)有很多不足的地方,我會(huì)改進(jìn)也歡迎大神可以給我一些意見(jià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í)的字符串中沒(méi)有空格然后就手動(dòng)分割了

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;
  }

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • 深入解析Java的設(shè)計(jì)模式編程中單例模式的使用

    深入解析Java的設(shè)計(jì)模式編程中單例模式的使用

    這篇文章主要介紹了深入解析Java的設(shè)計(jì)模式編程中單例模式的使用,一般來(lái)說(shuō)將單例模式分為餓漢式單例和懶漢式單例,需要的朋友可以參考下
    2016-02-02
  • 淺談Java HttpURLConnection請(qǐng)求方式

    淺談Java HttpURLConnection請(qǐng)求方式

    這篇文章主要介紹了淺談Java HttpURLConnection請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java使用Servlet生成驗(yàn)證碼圖片

    Java使用Servlet生成驗(yàn)證碼圖片

    這篇文章主要為大家詳細(xì)介紹了Java使用Servlet生成驗(yàn)證碼圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析

    基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析

    這篇文章主要介紹了基于springboot+jwt實(shí)現(xiàn)刷新token過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java線程生命周期及轉(zhuǎn)換過(guò)程

    Java線程生命周期及轉(zhuǎn)換過(guò)程

    這篇文章主要介紹了Java線程生命周期及轉(zhuǎn)換過(guò)程,線程的生命周期指的是線程從創(chuàng)建到銷毀的整個(gè)過(guò)程初始狀態(tài)、可運(yùn)行狀態(tài)、運(yùn)行狀態(tài)、休眠狀態(tài)、終止?fàn)顟B(tài),更多詳細(xì)介紹,需要的小伙伴可以參考下面文章內(nèi)容
    2022-05-05
  • 自定義log4j2中的Appender來(lái)獲取日志內(nèi)容的示例代碼

    自定義log4j2中的Appender來(lái)獲取日志內(nèi)容的示例代碼

    在 Log4j2 中,Appender 是負(fù)責(zé)將日志事件輸出到目標(biāo)地點(diǎn)的組件,本文講述的是通過(guò) log4j 中自定義的 Appender 來(lái)獲取需要打印的日志信息,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-02-02
  • Java運(yùn)用設(shè)計(jì)模式中的建造者模式構(gòu)建項(xiàng)目的實(shí)例解析

    Java運(yùn)用設(shè)計(jì)模式中的建造者模式構(gòu)建項(xiàng)目的實(shí)例解析

    這篇文章主要介紹了Java運(yùn)用設(shè)計(jì)模式中的建造者模式構(gòu)建項(xiàng)目的實(shí)例解析,建造者模式對(duì)外隱藏創(chuàng)建過(guò)程的產(chǎn)品,使用組合的方式,由指揮者來(lái)決定建造的流程,需要的朋友可以參考下
    2016-04-04
  • Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析

    Netty分布式固定長(zhǎng)度解碼器實(shí)現(xiàn)原理剖析

    這篇文章主要為大家介紹了Netty分布式固定長(zhǎng)度解碼器原理剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Java實(shí)現(xiàn)爬蟲(chóng)

    Java實(shí)現(xiàn)爬蟲(chóng)

    這篇文章介紹了Java實(shí)現(xiàn)爬蟲(chóng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • JAVA與SQL 中的null與NULL解析

    JAVA與SQL 中的null與NULL解析

    這篇文章主要介紹了JAVA與SQL 中的null與NULL解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

邹平县| 石狮市| 阳西县| 德昌县| 元阳县| 涪陵区| 青铜峡市| 乌海市| 上思县| 久治县| 临颍县| 松潘县| 东乡族自治县| 特克斯县| 南华县| 东乡族自治县| 广德县| 绥宁县| 科尔| 九龙城区| 酉阳| 博湖县| 藁城市| 买车| 宣威市| 平乐县| 淮滨县| 哈尔滨市| 泰宁县| 河曲县| 民和| 云龙县| 垦利县| 中牟县| 育儿| 潼南县| 大宁县| 永嘉县| 印江| 登封市| 雷州市|