日期:2014-05-20  浏览次数:20646 次

公式解析方法求教
输入任意公式,可进行运算解析,如[(1+2)*4-1]*(1+2)-4;((3-1)/*(2-1)+6)+8-(8-7);
------解决方案--------------------
进行表达式解析即可。有两种方式:
1. 中缀表达式解析,你可以采用“算符优先法”。先计算括号,然后计算优先级高的操作符,最后从左到右进行计算。为实现解析,需要两个栈,一个用于保存操作符,一个用于保存操作数以及结果,当读到操作符时并不能立即作计算,需要与操作符栈顶元素进行优先级比较,根据结果然后采用不同的处理方式, 而且算法在时间复杂度以及空间复杂度都较高.
2. 后缀表达式解析,解析流程
   从左到右读取中缀表达式,依次一个操作项
   如果是操作数直接进入输出队列
   读到左括号时总是将它压入栈中
   读到右括号, 将最近栈顶的第一个左括号上面的操作符全部依次弹出, 送至输出队列后, 再丢弃左括号
   当读到操作符时,将栈中所有优先级高于或等于当前操作符的操作符弹出,送到输出队列中
   中缀表达式全部读完后,若栈中仍然有运算符,将其送到输出队列中
   
   后缀表达式由于其自身的优点,表达式的解析是按照操作符的出现顺序进行的,比较简单,扫描一遍即可完成解析.但需要将中缀表达式转化为后缀表达式.
建议使用后缀表达式解析,较简单。
   不过你可能需要先了解一下编译原理中的词法扫描方面的知识,因为你需要将你的表达式解析为最小的词素(Token)
   
   
------解决方案--------------------
这些内容编译原理中都有介绍,机械工业出版社有本《编译原理(第2版)——计算机科学丛书》,不错,你可以参考参考。
1.你首先需要扫描你的表达式,把每一个词素扫描出来,并且确定其类型,例如2 * (12 + 3),你会得到
  2     操作数
  *     操作符
  (     左括号
  12    操作数
  +     操作符
  3     操作数
  )     右括号
2. 中缀表达式的将扫描结果,翻译成后缀表达式。然后按照后缀表达式的解析进行处理即可。
------解决方案--------------------
终于帮你找了一个C#实现的例子!


Simple(x) Numerical Formula Parser


演示项目Exe:http://www.simplexnumerica.com/SimplexParserExe.zip
演示项目源码:http://www.codeproject.com/KB/recipes/rwformulaparser/SimplexParser_demo.zip
公式解析类源码:http://www.codeproject.com/KB/recipes/rwformulaparser/SimplexParser_src.zip


运行效果图: