下載實例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074
程序主要包括:基礎結構定義、詞法分析、語法分析、算術運算
基礎結構定義:枚舉(操作數類型、操作符類型、標記類型、有限狀態自動機);
結構(操作數、操作符、標記、標記鏈)。
詞法分析:將字符串分解成有效標記(有效的操作數和操作符),生成標記鏈表。
語法分析:分析括弧的有效性,操作數、操作符的排列有效性,操作符與操作數類型匹配關係。
算術運算:使用後綴表達式運算規則,根據後綴表達式鏈表進行求值。首先將我們日常應用的中綴表達式轉換為後綴表達式。例如: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) | + |
閱讀更多 代碼專家 的文章