java实现任意四则运算表达式求值算法
本文实例讲述了java实现任意四则运算表达式求值算法。分享给大家供大家参考。具体分析如下:
该程序用于计算任意四则运算表达式。如4*(10+2)+1的结果应该为49。
算法说明:
1.首先定义运算符优先级。我们用一个
Map<String,Map<String,String>>
来保存优先级表。这样我们就可以通过下面的方式来计算两个运算符的优先级了:
/**
*查表得到op1和op2的优先级
*@paramop1运算符1
*@paramop2运算符2
*@return">","<"或"="
*/
publicStringpriority(Stringop1,Stringop2){
returnpriorityMap.get(op1).get(op2);
}
2.扫描表达式字符串,每次读入一个token进行处理。
使用两个辅助栈:optStack用于保存运算符,numStack用于保存操作数.我们用'#'作为表达式的起始和结果标志符。
读入一个token,如果它是数字,则压入numStack栈中;
如果它是运算符,则取出optStack栈的栈顶元素A,将A与token进行优先级比较。
如果A<token,则将token压入optStack栈。
如果A=token,则说明token和A是一对括号,此时将optStack栈的栈顶元素弹出。
如果A>token,则从numStack中弹出2个操作数,从optStack中弹出1个运算符,并计算结果。
当optStrack栈为空时(即栈顶元素为'#'),numStack栈的栈顶元素即为表达式的值。
算法实现:
/**
*算术表达式求值。
*3+4*12结果为51
*@authorwhf
*
*/
publicclassEvaluateExpression{
//运算符优先级关系表
privateMap<String,Map<String,String>>priorityMap=newHashMap<String,Map<String,String>>();
privateLinkedStack<String>optStack=newLinkedStack<String>();
//运算符栈
privateLinkedStack<Double>numStack=newLinkedStack<Double>();
//操作数栈
/**
*计算表达式
*@paramexp四则运算表达式,每个符号必须以空格分隔
*@return
*/
publicdoublecalcualte(Stringexp){
StringTokenizerst=newStringTokenizer(exp);
while(st.hasMoreTokens()){
Stringtoken=st.nextToken();
process(token);
}
returnnumStack.pop();
}
/**
*读入一个符号串。
*如果是数字,则压入numStack
*如果是运算符,则将optStack栈顶元素与该运算符进行优先级比较
*如果栈顶元素优先级低,则将运算符压入optStack栈,如果相同,则弹出左括号,如果高,则取出2个数字,取出一个运算符执行计算,然后将结果压入numStack栈中
*@paramtoken
*/
privatevoidprocess(Stringtoken){
while(false=="#".equals(optStack.getTop())||false==token.equals("#")){
//tokenisnumeric
if(true==isNumber(token)){
numStack.push(Double.parseDouble(token));
break;
//tokenisoperator
}else{
Stringpriority=priority(optStack.getTop(),token);
if("<".equals(priority)){
optStack.push(token);
break;
}elseif("=".equals(priority)){
optStack.pop();
break;
}else{
doubleres=calculate(optStack.pop(),numStack.pop(),numStack.pop());
numStack.push(res);
}
}
}
}
/**
*执行四则运算
*@paramopt
*@paramn1
*@paramn2
*@return
*/
privatedoublecalculate(Stringopt,doublen1,doublen2){
if("+".equals(opt)){
returnn2+n1;
}elseif("-".equals(opt)){
returnn2-n1;
}elseif("*".equals(opt)){
returnn2*n1;
}elseif("/".equals(opt)){
returnn2/n1;
}else{
thrownewRuntimeException("unsupportedoperator:"+opt);
}
}
/**
*检查一个String是否为数字
*@paramtoken
*@return
*/
privatebooleanisNumber(Stringtoken){
intLEN=token.length();
for(intix=0;ix<LEN;++ix){
charch=token.charAt(ix);
//跳过小数点
if(ch=='.'){
continue;
}
if(false==isNumber(ch)){
returnfalse;
}
}
returntrue;
}
/**
*检查一个字符是否为数字
*@paramch
*@return
*/
privatebooleanisNumber(charch){
if(ch>='0'&&ch<='9'){
returntrue;
}
returnfalse;
}
/**
*查表得到op1和op2的优先级
*@paramop1运算符1
*@paramop2运算符2
*@return">","<"或"="
*/
publicStringpriority(Stringop1,Stringop2){
returnpriorityMap.get(op1).get(op2);
}
/**
*构造方法,初始化优先级表
*/
publicEvaluateExpression(){
//initializestack
optStack.push("#");
//initializeprioritytable
//+
Map<String,String>subMap=newHashMap<String,String>();
subMap.put("+",">");
subMap.put("-",">");
subMap.put("*","<");
subMap.put("/","<");
subMap.put("(","<");
subMap.put(")",">");
subMap.put("#",">");
priorityMap.put("+",subMap);
//-
subMap=newHashMap<String,String>();
subMap.put("+",">");
subMap.put("-",">");
subMap.put("*","<");
subMap.put("/","<");
subMap.put("(","<");
subMap.put(")",">");
subMap.put("#",">");
priorityMap.put("-",subMap);
//*
subMap=newHashMap<String,String>();
subMap.put("+",">");
subMap.put("-",">");
subMap.put("*",">");
subMap.put("/",">");
subMap.put("(","<");
subMap.put(")",">");
subMap.put("#",">");
priorityMap.put("*",subMap);
///
subMap=newHashMap<String,String>();
subMap.put("+",">");
subMap.put("-",">");
subMap.put("*",">");
subMap.put("/",">");
subMap.put("(","<");
subMap.put(")",">");
subMap.put("#",">");
priorityMap.put("/",subMap);
//(
subMap=newHashMap<String,String>();
subMap.put("+","<");
subMap.put("-","<");
subMap.put("*","<");
subMap.put("/","<");
subMap.put("(","<");
subMap.put(")","=");
//subMap.put("#",">");
priorityMap.put("(",subMap);
//)
subMap=newHashMap<String,String>();
subMap.put("+",">");
subMap.put("-",">");
subMap.put("*",">");
subMap.put("/",">");
//subMap.put("(","<");
subMap.put(")",">");
subMap.put("#",">");
priorityMap.put(")",subMap);
//#
subMap=newHashMap<String,String>();
subMap.put("+","<");
subMap.put("-","<");
subMap.put("*","<");
subMap.put("/","<");
subMap.put("(","<");
//subMap.put(")",">");
subMap.put("#","=");
priorityMap.put("#",subMap);
}
}
程序测试:
Stringexp="4*(10+2)+1#"; EvaluateExpressionee=newEvaluateExpression(); out.println(ee.calcualte(exp));
运行结果为49。
希望本文所述对大家的C++程序设计有所帮助。