.net表达式计算器(中缀表达式转后缀表达式,支持20多个数学函数,支持函数嵌套)

最近在网上查了一下表达工计算器的类库,发现Java版本的有一个比较成熟的叫W3EVal,好像是一个IBM工程师写的,.net就很少了(可能是我了解不够多),但投机取巧的实现思路有很多,比如:
  (1)将Javasript中代码编译成.net类库,利用Javascript中的eval函数来实现;
  (2)利用ScriptControl执行JavaScript脚本实现;
  (3)利用DataTable的计算功能实现简单计算;
  (4)利用.net动态编译功能来实现等
  这些方法在csdn的坛里有讨论,请见:http://topic.csdn.net/u/20070301/13/c8c33bd1-f146-4b44-9882-aab6d430f724.html

  心想既然还没有成熟的.net类库,何不自己做一个呢,其实并不难,只要稍有点耐心调试一下就好了。于是参考一编中缀表达式转后缀表达式的论文,很快写了一个,发现效果不错,所以发出来跟大家共享,希望对大家有用。

  中缀表达式转后缀表达式的步骤为:
  1.新建一个Stack栈,用来存放运算符
  2.新建一个post栈,用来存放最后的后缀表达式
  3.从左到右扫描中缀表达式:
    (1)若读到的是操作数,直接存入post栈,以#作为数字的结束
    (2)若读到的是(,则直接存入stack栈
    (3)若读到的是),则将stack栈中(前的所有运算符出栈,存入post栈
    (4)若读到的是其它运算符,则将该运算符和stack栈顶运算符作比较:若高于或等于栈顶运算符,则直接存入stack栈,否则将栈顶运算符(所有优先级高于读到的运算符的,不包括括号)出栈,存入post栈。最后将读到的运算符入栈。
  4.当扫描完后,stack栈中还在运算符时,则将所有的运算符出栈,存入post栈
             

  计算后缀表达式的值的步骤为:
  1.初始化一个空堆栈
  2.从左到右读入后缀表达式
  3.如果字符是一个操作数,把它压入堆栈。
  4.如果字符是个操作符,弹出两个操作数,执行恰当操作,然后把结果压入堆栈。如果您不能够弹出两个操作数,后缀表达式的语法就不正确。
  5.到后缀表达式末尾,从堆栈中弹出结果。若后缀表达式格式正确,那么堆栈应该为空。

  类库的名称就名为NEval ,感觉还比较健壮,速度很快,支持20个数学函数,很容易扩充。目前还没有表达式合法性检查的功能,有兴趣的朋友可以扩充一下,先谢谢。
&nbspDevExpress 控件 ;

  代码如下:

代码
;
        }        
    }

    /// <summary>
    /// 可以检测到的表达式错误的Exception
    /// </summary>
    public class ExpressionException : Exception
    {
        public override string Message
        {
            get
            {
                return base.Message;
            }
        }
    }

    /// <summary>
    /// 字符类别
    /// </summary>
    public enum LetterType
    {
        Number,
        SimpleOperator,
        Function,
        OpeningParenthesis,
        ClosingParenthesis
    }

  调用代码如下:

  string expr = txtExpression.Text;

  NEval neval = new NEval();
       return neval.Eval(expr);

上一篇:java笔记 -- 数学函数与常量


下一篇:#define与typedef在重定义类型中的区别