怎样计算一个字符串表达式的值?比如“const char str_0[] ="2+2+(3*3-1)" ”的值。算数表达式是以字符串形式提供。这个用处还是非常大,比如我们可以将所有的算术题写在txt文件中。然后使用该方法计算算数的结果。那么利用该方法我们可以在一分钟内计算出上千道算术题。即使利用我们的台式机也完全可以做到。

     基本思路如下:

  1.  获取算数字符串表达式,比如字符串 str ="1+2+3*(4/5+6.6)*7".
  2. 将该字符串中每一运算单元拆分开,按照从左到右将算数表达式拆分。比如将 "1+2+3*(4/5+6)*7"拆分为1、+、2、+、3、*、(、4、/、5、+、6.6、)、*、7。并且将其按照顺序存放到数组中。
  3. 将中缀表达式转换为后缀表达式,为了方便以后处理,将其压栈。
  4. 计算后缀表达式。

 

                    第一节 字符串的获取 

      获取的方式很多,可以从键盘输入,或者从文件中读取。在此我们暂时使用一个全局字符串提供。

      str ="1+2+3*(4/5+6.6)*7"

 

                     第二节 将字符串拆分为运算单元

     "1+2+3*(4/5+6.6)*7" 可以拆分为1、+、2、+、3、*、(、4、/、5、+、6.6、)、*、7。我们可以使用数组保存。因为每个运算单元的功能不同,我们可以将其分为整型、浮点型、运算符。其中运算符包括“+、-、*、/”.那么接点就必须具有保存这三种数据的功能。由此可以采用数据结构来实现。

 enum { DOUBLE_ENUM, INT_ENUM, OPT_ENUM } NODE_ENUM;
 
typedef struct  {
   double value_double;
   int value_int;
   char value_opt;
 
   enum NODE_ENUM vlaue_ty;
} NODE_TY;

vlaue_ty 是数据类型,  取值范围 DOUBLE_ENUM(浮点数)、INT_ENUM(整型)、 OPT_ENUM(操作符)。扫描字符串,将其拆分,然后存储到NODE_TY  node_array[32]数组中。

 

 

                          第三节 将拆分结果转化为后缀表达式    

  将 "2+2+(3*3-1)" 拆分为1、+、2、+、3、*、(、4、/、5、+、6.6、)、*、7。如果将其存储到NODE_TY  node_array[32]。那么我们就可以使用node_array[32]创见后缀表达式。

     后缀表达式为:1,2,+,3,4,5,/,6.6,+,*,+,7,

                             第四节 计算后缀表达式的值

   按照后缀表达式的计算规则计算该表达式的值 1,2,+,3,4,5,/,6.6,+,*,+,7。后缀表达式的计算有成熟的方法。

       我已经完成了该公式的计算。

      bbbbbb.JPG

 

 

 

  我将以上处理过程封装了一个函数,只要提供一个字符串就可以计算出该值。

cccccc.JPG