Java計算器(使用逆波蘭表示式演算法)

atlantisholic發表於2012-02-17
  1. package com.infogrid.g2b;   
  2.   
  3. import java.util.HashMap;   
  4. import java.util.Map;   
  5.   
  6.   
  7. public class Op {   
  8.        
  9.     private static final Map ops = new HashMap();   
  10.     static{   
  11.         ops.put("+",10);   
  12.         ops.put("-",10);   
  13.         ops.put("*",20);   
  14.         ops.put("/",20);   
  15.         ops.put("%",20);   
  16.         ops.put("(",100);   
  17.         ops.put(")",100);   
  18.     }   
  19.        
  20.     public static boolean isSign(String sign1){   
  21.         Integer s = ops.get(sign1);   
  22.         if(s==null)   
  23.             return false;   
  24.         else  
  25.             return true;   
  26.     }   
  27.        
  28.     public static int compare(String sign1,String sign2){   
  29.         Integer p1 = ops.get(sign1);   
  30.         Integer p2 = ops.get(sign2);   
  31.         if(p1==null)   
  32.             throw new IllegalArgumentException("符號:"+sign1+"不存在!");   
  33.         if(p2==null)   
  34.             throw new IllegalArgumentException("符號:"+sign2+"不存在!");   
  35.         return p1-p2;   
  36.     }   
  37.        
  38.     public static Object cal(Object x,Object y,String sign){   
  39.         Double a=0.0,b=0.0;   
  40.         a = Double.valueOf(x+"");   
  41.         b = Double.valueOf(y+"");   
  42.         if(sign.equals("+"))   
  43.             return a+b;   
  44.         if(sign.equals("-"))   
  45.             return a-b;   
  46.         if(sign.equals("*"))   
  47.             return a*b;   
  48.         if(sign.equals("/"))   
  49.             return a/b;   
  50.         if(sign.equals("%"))   
  51.             return a%b;   
  52.         throw new IllegalArgumentException("操作符不合法!");   
  53.     }   
  54. }  
  1. package com.infogrid.g2b;   
  2.   
  3. import java.util.ArrayList;   
  • import java.util.List;   
  • import java.util.Stack;   
  •   
  • public class Calculator {   
  •        
  •     private List list = new ArrayList();   
  •     private Stack stack = new Stack();   
  •        
  •        
  •     private List resolveExpr(String exp){      
  •         String opert=exp.replaceAll("\\d*\\.\\d+?""");   
  •         List list=new ArrayList();      
  •         int pidx=-1;      
  •         for(int i=0;i
  •             String p=opert.substring(i, i+1);      
  •             pidx=exp.indexOf(p);      
  •             if(exp.substring(0,pidx).trim().length()!=0){      
  •                 list.add(exp.substring(0, pidx));      
  •             }      
  •             list.add(exp.substring(pidx, pidx+1));      
  •             exp=exp.substring(pidx+1);      
  •         }      
  •         if(exp.length()>0){      
  •             list.add(exp);      
  •         }      
  •         return list;      
  •     }      
  •        
  •     private void dealSign(String s){   
  •         if(stack.size()==0){   
  •             stack.push(s);   
  •             return;   
  •         }   
  •         String ps = stack.pop();   
  •         if(Op.compare(s, ps)>0||ps.equals("(")){   
  •             if(s.equals(")")){   
  •                 list.add(ps);   
  •                 while(stack.size()>0){   
  •                     ps = stack.pop();   
  •                     if(ps.equals("("))   
  •                         break;   
  •                     list.add(ps);   
  •                 }   
  •             }else{   
  •                 stack.push(ps);   
  •                 stack.push(s);   
  •             }   
  •         }else{   
  •             list.add(ps);   
  •             dealSign(s);   
  •         }   
  •     }   
  •        
  •     private void dealVar(String s){   
  •         list.add(s);   
  •     }   
  •        
  •     private Double getResult(){   
  •         for(String s:list){   
  •             if(!Op.isSign(s)){   
  •                 stack.push(s);   
  •                 continue;   
  •             }   
  •             Object a = 0,b = 0;   
  •             if(stack.size()>0)   
  •                 b = stack.pop();   
  •             if(stack.size()>0)   
  •                 a = stack.pop();   
  •             stack.push(Op.cal(a, b, s)+"");   
  •         }   
  •         return Double.valueOf(stack.pop());   
  •     }   
  •        
  •     public Double calculate(String expression){   
  •         List ss = resolveExpr(expression);   
  •         for(String s:ss){   
  •             if(Op.isSign(s)){   
  •                 dealSign(s);   
  •             }else{   
  •                 dealVar(s);   
  •             }   
  •         }   
  •         while(stack.size()>0){   
  •             list.add(stack.pop());   
  •         }   
  •         System.out.println(list);   
  •            
  •         return getResult();   
  •     }   
  •        
  •        
  •   
  •        
  •     public static void main(String[] args) {   
  •         System.out.println(new Calculator().calculate("1.5+2.1+((4/2)-6/((2+1)*2))+6%4"));   
  •     }   
  • }  
  • 來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-716661/,如需轉載,請註明出處,否則將追究法律責任。

    相關文章