posts - 41, comments - 15, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          java處理字符串的四則運算

          Posted on 2012-12-11 16:24 yuhaibo736 閱讀(1135) 評論(0)  編輯  收藏


          package com.cbd.dk.test;

          import java.util.ListIterator;
          import java.util.Stack;

          public class Test {

           private String src;

           public Test(String src) {
            this.src = src;
           }
           public double getResult() {
            String postfix = getPostfix();
            Stack<String> stk = new Stack<String>();
            //System.out.println(postfix);
            String parts[] = postfix.split(" +");
            double result=0;
            for(int i=0; i<parts.length; i++){
             char tmp = parts[i].charAt(0);
             if(!isOperator(tmp)){
              stk.push(parts[i]);
             }else{
              double a = Double.parseDouble(stk.pop());
              double b = Double.parseDouble(stk.pop());
              result = calculate(b,a,tmp);
              stk.push(String.valueOf(result));
             }
            }
            return result;
           }


           /**
            * test if the character is an operator,such +,-,*,/
            * @param op  the character to test
            * @return  true if op is an operator otherwise false
            */
           private boolean isOperator(char op){
            return (op=='+'||op=='-'||op=='*'||op=='/');
           }


           /**
            * calculate an expression such (a op b)
            * @param a  number 1
            * @param b  number 2
            * @param op the operator
            * @return  (double)(a op b)
            */
           public double calculate(double a, double b, char op) {
            switch (op) {
             case '+':
              return a + b;
             case '-':
              return a - b;
             case '*':
              return a * b;
             case '/':
              return a / b;
            }
            return -1;
           }


           /**
            * convert the suffix to postfix
            * @return the postfix as a string
            */
           private String getPostfix() {
            Stack<String> stk = new Stack<String>();
            String postfix = new String();
            char op;
            int i = 0;
            while (i < src.length()) {
             if (Character.isDigit(src.charAt(i))||src.charAt(i)=='.') {
              postfix += " ";
              do {
               postfix += src.charAt(i++);
              } while ((i < src.length()) && (Character.isDigit(src.charAt(i))));
              postfix += " ";
             }else {
              switch (op = src.charAt(i++)) {
               case '(':
                stk.push("(");
                break;
               case ')':
                while (stk.peek() != "(") {
                 String tmp = stk.pop();
                 postfix += tmp;
                 if(tmp.length()==1 && isOperator(tmp.charAt(0)))
                  postfix += " ";
                }
                stk.pop();
                postfix += " ";
                break;
               case '+':
               case '-':
                while ((!stk.empty()) && (stk.peek() != "(")) {
                 postfix += stk.pop()+" ";
                }
                stk.push(new Character(op).toString());
                break;
               case '*':
               case '/':
                while ((!stk.empty()) && ((stk.peek() == "*") || (stk.peek() == "/"))) {
                 postfix += stk.pop()+" ";
                }
                stk.push(new Character(op).toString());
                break;
              }
             }
            }
            ListIterator it = stk.listIterator(stk.size());
            while (it.hasPrevious())
             postfix += it.previous() + " ";
            return postfix.trim().replaceAll(" +\\.",".");
           }

           /**
            * main function
            * @param args
            */
           public static void main(String args[]) {
            //System.out.println(new Test("((1.5+6.000)*9+9.36)*(8-8*8+8*7)").getResult());
            System.out.println(new Test("(2+(3*2)/2)").getResult());
           }
          }


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 鹤庆县| 全州县| 华安县| 甘洛县| 阳新县| 太湖县| 朝阳县| 拜城县| 海门市| 高唐县| 潼关县| 子长县| 柞水县| 巴塘县| 绵阳市| 诏安县| 滨海县| 饶阳县| 栾城县| 哈巴河县| 鹿泉市| 广平县| 大姚县| 上虞市| 襄垣县| 凤凰县| 林口县| 镇安县| 农安县| 金川县| 牙克石市| 城口县| 林口县| 郧西县| 湘潭市| 永宁县| 西城区| 临海市| 灯塔市| 朝阳市| 昌图县|