HF_Cherish

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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     }
View Code

上述代码也可以用堆栈实现,一个栈存数,一个栈存操作符,在处理有括号的情况时,更方便些。

2.2 后缀表达式计算

后缀表达式即运算符在运算数之后的表达式,如上式解析之后就变成:12+3*4-

后缀表达式计算,即先把一般表达式转化为后缀表达式后,直接用一个栈就可以实现:遍历后缀表达式,遇到操作符,就将栈顶两个数出栈进行计算,并将计算结果入栈。

这是图解后缀表达式计算的过程的文章。另从网上copy了一些流程图,代码还没写:

 

posted on 2015-08-13 21:46  HF_Cherish  阅读(593)  评论(0编辑  收藏  举报