• 表达式计算


    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了一些流程图,代码还没写:

  • 相关阅读:
    Elasticsearch Mantanence Lessons Learned Today
    RabbitMQ Exchange & Queue Design Trade-off
    Understanding RabbitMQ Exchange & Queue
    Behind RabbitMQ Exchange Types
    七步,搭建基于Windows平台完美Jekyll博客环境
    How to Change RabbitMQ Queue Parameters in Production?
    Android Weekly Notes Issue #237
    Android Weekly Notes Issue #236
    Android Weekly Notes Issue #235
    Android Weekly Notes Issue #234
  • 原文地址:https://www.cnblogs.com/hf-cherish/p/4728548.html
Copyright © 2020-2023  润新知