最近在網上查了一下表達工計算器的類庫,發現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>