zoukankan      html  css  js  c++  java
  • 表达式计算

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

  • 相关阅读:
    Rainmeter 雨滴桌面 主题分享
    行人检測之HOG特征(Histograms of Oriented Gradients)
    const和readonly差别
    ADB命令解析
    Java实现 蓝桥杯VIP 算法训练 接水问题
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
  • 原文地址:https://www.cnblogs.com/hf-cherish/p/4728548.html
Copyright © 2011-2022 走看看