最近看了一些關於表示式求值的文章,四則運算表示式求值,在網路上各種語言
的版本都能找到。了解其基本原理,方便在一些應用系統中的應用擴充套件。下面是在自
己理解的基礎上,用c#語言,以比較簡單直觀的方法實現四則運算表示式求值程式。
程式主要包括:基礎結構定義、詞法分析、語法分析、算術運算
基礎結構定義:列舉(運算元型別、操作符型別、標記型別、有限狀態自動機);
結構(運算元、操作符、標記、標記鏈)。
詞法分析:將字串分解成有效標記(有效的運算元和操作符),生成標記鍊錶。
語法分析:分析括弧的有效性,運算元、操作符的排列有效性,操作符與運算元型別
匹配關係。
算術運算:使用字尾表示式運算規則,根據字尾表示式鍊錶進行求值。首先將我們日常
應用的中綴表示式轉換為字尾表示式。例如:6*(5-3) 轉換為 6 5 3 - *,6-2+5*2
轉換為 6 2 - 5 2 * +
這裡對字尾表示式的轉換作乙個說明,每個操作符有乙個運算優先順序(oper_pri),
但是當表示式中含有括弧時,括弧中的操作符運算優先順序會改變。所以增設了乙個括
弧深度優先順序(deep_pri)。採用兩個優先順序的方式比使用棧顯得簡單易讀。
操作符oper_pri+7
-7*9
在轉換時,操作符擁有兩個優先順序,表示為:操作符(deep_pri,oper_pri)
依次輸入表示式 5+(8-2*3)*4 的各個標記 最後輸出5 8 2 3 * - 4 * +。
輸入臨時空間
輸入操作符時,放入臨時空
間,同時觸發動作。
操作符(deep_pri,oper_pri)
初始 deep_pri=0
動作輸入』(』時,deep_pri++
輸入』)』時,deep_pri--
輸入操作符時,上乙個操作符與其比較
優先順序,為true,則輸出上一操作符。
比較規則:
deep_pri > deep_pri ||
(deep_pri == deep_pri &&
oper_pri >= oper_pri)
輸出運算元直接輸出5
5++(0,7)
(+(0,7)
deep_pri++
8+(0,7)8-
+(0,7)
-(1,7)
+(0,7)與 -(1,7)比較
0>1||(0==1&&7>=7) 為false 不輸出
2+(0,7)
-(1,7)2*
+(0,7)
-(1,7)
*(1,9)
-(1,7)與 *(1,9)比較
1>1||(1==1&&7>=9) 為false 不輸出
3+(0,7)
-(1,7)
*(1,9)3)
+(0,7)
-(1,7)
*(1,9)
deep_pri--
*+(0,7)
-(1,7)
*(1,9)
*(0,9)
*(1,9)與 *(0,9)比較
1>0||(1==0&&9>=9) 為true 輸出*(1,9)
*+(0,7)
-(1,7)
*(0,9)
-(1,7)與 *(0,9)比較
1>0||(1==0&&7>=9)為true 輸出-(1,7)
-+(0,7)
*(0,9)
+(0,7)與 *(0,9)比較
0>0||(0==0&&7>=9) 為false 不輸出
4+(0,7)
*(0,9)
4+(0,7)
*(0,9)
沒有操作符:倒序輸出臨時空間值
*+(0,7)+
C 四則運算表示式解析器
程式主要包括 基礎結構定義 詞法分析 語法分析 算術運算 基礎結構定義 列舉 運算元型別 操作符型別 標記型別 有限狀態自動機 結構 運算元 操作符 標記 標記鏈 詞法分析 將字串分解成有效標記 有效的運算元和操作符 生成標記鍊錶。語法分析 分析括弧的有效性,運算元 操作符的排列有效性,操作符與運算...
四則運算表示式求值
03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...
四則運算表示式求值
表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...