Java实现四则混合运算代码示例
使用栈来实现,可以处理运算优先级。
使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2。无需把表达式先转换为逆波兰等形式。
packagecom.joshua.cal; importjava.util.Collections; importjava.util.HashMap; importjava.util.HashSet; importjava.util.LinkedList; importjava.util.List; importjava.util.Map; importjava.util.Set; importjava.util.Stack; publicclassCalculator{ privatefinalStacknumStack=newStack (); privatefinalStack opStack=newStack (); privatecharcurrentOperator; privatecharopStackTop; privateinti; privateStringexpression; @SuppressWarnings("rawtypes") publicvoidexec(Stringexpression){ try{ clean(); if(expression==null||expression.isEmpty()){ thrownewIllegalArgumentException("BlankExpression!"); } this.expression=expression; opStack.push(TERMINATE_TOKENS.START_END_MARK); Listtokens=TOKENIZER.exec(expression +TERMINATE_TOKENS.START_END_MARK); for(;i ': processStackHigerPriorityOperator(); break; case'<': processStackLowerPriorityOperator(); break; case'=': processStackEqualPriorityOperator(); break; default: break; } } privatevoidprocessStackLowerPriorityOperator(){ opStack.push(currentOperator); } privatevoidprocessStackHigerPriorityOperator(){ numStack.push(CALCULATE.exec(opStack.pop(),numStack.pop(), numStack.pop())); --i;//pointerbacktothepreviousoperator. } privatevoidprocessStackEqualPriorityOperator(){ if(TERMINATE_TOKENS.START_END_MARK==currentOperator){ System.out.println(expression+"="+numStack.peek()); }elseif(')'==currentOperator){ opStack.pop(); } } publicvoidclean(){ numStack.clear(); opStack.clear(); i=0; } publicstaticvoidmain(String[]args){ Calculatorcal=newCalculator(); cal.exec("4+(3*(3-1)+2)/2");//=8 cal.exec("4+(-3*(3-1)+2)");//=0 cal.exec("4+-/(-3*(3-1)+2)");//incorrectexpression! cal.exec("4.5+(3.2+3)/2");//=7.6 cal.exec("4.5+(3.2:3)/2");//incorrectexpression! cal.exec("-4.5+(3.2-3)/2");//=-4.4 } } enumCALCULATE{ INSTANCE; publicstaticdoubleexec(finalcharoperator,finaldoubleright, finaldoubleleft){ switch(operator){ case'+': returnleft+right; case'-': returnleft-right; case'*': returnleft*right; case'/': returnleft/right; default: thrownewIllegalArgumentException("Unsupportedoperator:" +operator); } } } enumTERMINATE_TOKENS{ INSTANCE; publicstaticfinalcharSTART_END_MARK='#'; privatestaticfinalMap TOKENs=newHashMap (); static{ //token,tokenid TOKENs.put('+',0); TOKENs.put('-',1); TOKENs.put('*',2); TOKENs.put('/',3); TOKENs.put('(',4); TOKENs.put(')',5); TOKENs.put(START_END_MARK,6); } privatestaticSet NEGATIVE_NUM_SENSITIVE=newHashSet (); publicstaticsynchronizedSet getNegativeNumSensitiveToken(){ if(NEGATIVE_NUM_SENSITIVE.size()==0){ NEGATIVE_NUM_SENSITIVE.addAll(TOKENs.keySet()); NEGATIVE_NUM_SENSITIVE.remove(')'); } returnNEGATIVE_NUM_SENSITIVE; } publicstaticbooleanisTerminateToken(finalchartoken){ Set keys=TOKENs.keySet(); returnkeys.contains(token); } publicstaticintgetTokenId(finalchartoken){ returnTOKENs.get(token)==null?-1:TOKENs.get(token); } publicstaticintgetTokenSize(){ returnTOKENs.size(); } } enumCALCULATE_MODE{ INSTANCE; privatestaticchar[][]RULES={ //+-*/()# {'>','>','<','<','<','>','>'},//+ {'>','>','<','<','<','>','>'},//- {'>','>','>','>','<','>','>'},//* {'>','>','>','>','<','>','>'},/// {'<','<','<','<','<','=','o'},//( {'>','>','>','>','o','>','>'},//) {'<','<','<','<','<','o','='},//# }; static{ if(RULES.length!=TERMINATE_TOKENS.getTokenSize()||RULES.length<1 ||RULES[0].length!=TERMINATE_TOKENS.getTokenSize()){ thrownewIllegalArgumentException("Rulesmatrixisincorrect!"); } } publicstaticchargetRule(finalcharcurrentOperator,finalcharopStackTop){ try{ returnRULES[TERMINATE_TOKENS.getTokenId(opStackTop)][TERMINATE_TOKENS .getTokenId(currentOperator)]; }catch(Throwablee){ thrownewRuntimeException("Norulesweredefinedforsometoken!"); } } } enumTOKENIZER{ INSTANCE; privatestaticfinalStringBuilderBUFFER=newStringBuilder(); privatestaticStringclearExpression(Stringexpression){ returnexpression.replaceAll("",""); } privatestaticCharacterPREVIOUS_CHAR; privatestaticvoidclean(){ BUFFER.delete(0,BUFFER.length()); PREVIOUS_CHAR=null; } privatestaticbooleanprocessNegativeNumbers(finalStringexp, finalintindex){ charc=exp.charAt(index); if(('+'==c||'-'==c) &&(PREVIOUS_CHAR==null||TERMINATE_TOKENS .getNegativeNumSensitiveToken().contains(PREVIOUS_CHAR)) &&!TERMINATE_TOKENS.isTerminateToken(exp.charAt(index+1))){ BUFFER.append(c); returntrue; } returnfalse; } @SuppressWarnings({"unchecked","rawtypes"}) publicstaticList>exec(finalStringexpression){ clean(); Stringexp=clearExpression(expression); Listresult=newLinkedList(); for(inti=0;i 0){ result.add(Double.valueOf(BUFFER.toString())); BUFFER.delete(0,BUFFER.length()); } result.add(c); }else{ BUFFER.append(c); } PREVIOUS_CHAR=c; } returnCollections.unmodifiableList(result); } }
输出
4+(3*(3-1)+2)/2=8.0 4+(-3*(3-1)+2)=0.0 4.5+(3.2+3)/2=7.6 -4.5+(3.2-3)/2=-4.4 IncorretExpression:4+-/(-3*(3-1)+2) Error:null IncorretExpression:4.5+(3.2:3)/2 Error:Forinputstring:"3.2:3"
总结
以上就是本文关于Java实现四则混合运算代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:大话Java混合运算规则 浅谈Java变量赋值运算符及相关实例 Java大数字运算之BigInteger 等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对毛票票网站的支持。