程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> .net表達式計算器(中綴表達式轉後綴表達式,支持20多個數學函數,支持函數嵌套)

.net表達式計算器(中綴表達式轉後綴表達式,支持20多個數學函數,支持函數嵌套)

編輯:C#入門知識

最近在網上查了一下表達工計算器的類庫,發現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個數學函數,很容易擴充。目前還沒有表達式合法性檢查的功能,有興趣的朋友可以擴充一下,先謝謝。
 

  代碼如下:

\\代碼 /// <summary>
    /// 表達式計算類。支持數學函數,支持函數嵌套
    /// 作者watsonyin
    /// 開發日期:2010年10月 版本1.0
    /// </summary>
    public class NEval
    {
        public NEval()
        {

        }

        public double Eval(string expr)
        {
            try
            {
                string tmpexpr = expr.ToLower().Trim().Replace(" ", string.Empty);
                return Calc_Internal(tmpexpr);
            }
            catch (ExpressionException eex)
            {
                throw eex;
            }
            catch
            {
                throw new Exception("表達式錯誤");
            }
        }

        private Random m_Random = null;
        private
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved