表达式计算器 java代码,Java使用逆波兰表达式算法制作的表达式计算器,波兰表达式计算器,package com....

该博客介绍了如何使用Java实现逆波兰表达式计算器。通过创建`Op`类来管理运算符优先级,并使用`Calculator`类解析和计算表达式。代码详细展示了从波兰表达式到结果的转换过程,包括符号判断、栈操作和变量处理。
摘要由CSDN通过智能技术生成

Java使用逆波兰表达式算法制作的表达式计算器,波兰表达式计算器,package com.package com.infogrid.g2b; import java.util.HashMap; import java.util.Map; public class Op { private static final Map ops = new HashMap(); static{ ops.put("+",10); ops.put("-",10); ops.put("*",20); ops.put("/",20); ops.put("%",20); ops.put("(",100); ops.put(")",100); } public static boolean isSign(String sign1){ Integer s = ops.get(sign1); if(s==null) return false; else return true; } public static int compare(String sign1,String sign2){ Integer p1 = ops.get(sign1); Integer p2 = ops.get(sign2); if(p1==null) throw new IllegalArgumentException("符号:"+sign1+"不存在!"); if(p2==null) throw new IllegalArgumentException("符号:"+sign2+"不存在!"); return p1-p2; } public static Object cal(Object x,Object y,String sign){ Double a=0.0,b=0.0; a = Double.valueOf(x+""); b = Double.valueOf(y+""); if(sign.equals("+")) return a+b; if(sign.equals("-")) return a-b; if(sign.equals("*")) return a*b; if(sign.equals("/")) return a/b; if(sign.equals("%")) return a%b; throw new IllegalArgumentException("操作符不合法!"); } } package com.infogrid.g2b; 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;i0){ 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")); } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值