1. Problem
代码实现表达式运算。
2. Solution
2.1 中缀表达式计算
中缀表达式即通常所见的算术表达式,如(1+2)*3-4
当前要参与运算的:两个数,一个操作符。
当前两个数可以直接运算的条件:操作符是*或/,或下一个操作符不是*或/
否则,应该更新第二个数,即将其与接下来的数进行乘除运算。
下边是只实现了+,-,*的代码,除法可以和乘法做相同的处理,根据具体情况处理除零问题
1 private Integer cal2( Integer a, Integer b, Character op ){ 2 if( op == '+' ) return a + b; 3 if( op == '-' ) return a - b; 4 return a * b; 5 } 6 7 private Integer calN( List<Integer> nums, int ns, int ne, List<Character> ops, int os, int oe ){ 8 int nLen = ne - ns + 1; 9 int oLen = oe - os + 1; 10 if( nLen == 1 ) return nums.get(ns); 11 int n1 = nums.get(ns), n2 = nums.get(ns+1); 12 int nI = ns + 2; //the next num to concern 13 int opI = os + 1; //the next op to concern 14 int presentOp = os; //the op between n1 & n2 15 while( nI < nLen ){ 16 if( ops.get(presentOp) == '*' || ops.get(opI) != '*' ){ 17 n1 = cal2( n1, n2, ops.get(presentOp) ); 18 n2 = nums.get(nI++); 19 presentOp = opI++; 20 } 21 else{ 22 n2 = n2 * nums.get(nI++); 23 opI++; 24 } 25 } 26 return cal2( n1, n2, ops.get(presentOp) ); 27 }
上述代码也可以用堆栈实现,一个栈存数,一个栈存操作符,在处理有括号的情况时,更方便些。
2.2 后缀表达式计算
后缀表达式即运算符在运算数之后的表达式,如上式解析之后就变成:12+3*4-
后缀表达式计算,即先把一般表达式转化为后缀表达式后,直接用一个栈就可以实现:遍历后缀表达式,遇到操作符,就将栈顶两个数出栈进行计算,并将计算结果入栈。
这是图解后缀表达式计算的过程的文章。另从网上copy了一些流程图,代码还没写: