ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Java计算器(使用逆波兰表达式算法)

Java计算器(使用逆波兰表达式算法)

原创 Linux操作系统 作者:atlantisholic 时间:2012-02-17 13:02:54 0 删除 编辑
  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;   
  4. import java.util.List;   
  5. import java.util.Stack;   
  6.   
  7. public class Calculator {   
  8.        
  9.     private List list = new ArrayList();   
  10.     private Stack stack = new Stack();   
  11.        
  12.        
  13.     private List resolveExpr(String exp){      
  14.         String opert=exp.replaceAll("\\d*\\.\\d+?""");   
  15.         List list=new ArrayList();      
  16.         int pidx=-1;      
  17.         for(int i=0;i
  18.             String p=opert.substring(i, i+1);      
  19.             pidx=exp.indexOf(p);      
  20.             if(exp.substring(0,pidx).trim().length()!=0){      
  21.                 list.add(exp.substring(0, pidx));      
  22.             }      
  23.             list.add(exp.substring(pidx, pidx+1));      
  24.             exp=exp.substring(pidx+1);      
  25.         }      
  26.         if(exp.length()>0){      
  27.             list.add(exp);      
  28.         }      
  29.         return list;      
  30.     }      
  31.        
  32.     private void dealSign(String s){   
  33.         if(stack.size()==0){   
  34.             stack.push(s);   
  35.             return;   
  36.         }   
  37.         String ps = stack.pop();   
  38.         if(Op.compare(s, ps)>0||ps.equals("(")){   
  39.             if(s.equals(")")){   
  40.                 list.add(ps);   
  41.                 while(stack.size()>0){   
  42.                     ps = stack.pop();   
  43.                     if(ps.equals("("))   
  44.                         break;   
  45.                     list.add(ps);   
  46.                 }   
  47.             }else{   
  48.                 stack.push(ps);   
  49.                 stack.push(s);   
  50.             }   
  51.         }else{   
  52.             list.add(ps);   
  53.             dealSign(s);   
  54.         }   
  55.     }   
  56.        
  57.     private void dealVar(String s){   
  58.         list.add(s);   
  59.     }   
  60.        
  61.     private Double getResult(){   
  62.         for(String s:list){   
  63.             if(!Op.isSign(s)){   
  64.                 stack.push(s);   
  65.                 continue;   
  66.             }   
  67.             Object a = 0,b = 0;   
  68.             if(stack.size()>0)   
  69.                 b = stack.pop();   
  70.             if(stack.size()>0)   
  71.                 a = stack.pop();   
  72.             stack.push(Op.cal(a, b, s)+"");   
  73.         }   
  74.         return Double.valueOf(stack.pop());   
  75.     }   
  76.        
  77.     public Double calculate(String expression){   
  78.         List ss = resolveExpr(expression);   
  79.         for(String s:ss){   
  80.             if(Op.isSign(s)){   
  81.                 dealSign(s);   
  82.             }else{   
  83.                 dealVar(s);   
  84.             }   
  85.         }   
  86.         while(stack.size()>0){   
  87.             list.add(stack.pop());   
  88.         }   
  89.         System.out.println(list);   
  90.            
  91.         return getResult();   
  92.     }   
  93.        
  94.        
  95.   
  96.        
  97.     public static void main(String[] args) {   
  98.         System.out.println(new Calculator().calculate("1.5+2.1+((4/2)-6/((2+1)*2))+6%4"));   
  99.     }   
  100. }  

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23071790/viewspace-716661/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-08-30

  • 博文量
    130
  • 访问量
    624248