?

表達式轉換及求值探析

2020-04-05 10:57
安順學院學報 2020年1期
關鍵詞:轉換法二叉樹后綴

(1、2.安順學院電子與信息工程學院,貴州 安順561000)

0 引言

表達式是由操作數、運算符和界限符組成。操作數可以是常數、變量、表達式,運算符可以是算術運算符、關系運算符和邏輯運算符,界限符有左右括弧和表達式結束符。表達式有中綴、前綴和后綴表示法。中綴表達式(通常稱表達式),是運算符放在兩操作數的中間,如:a+b、4*3/(4-2)+8,它是表達式的常見表示法。前綴表達式是運算符放在兩操作數的前面,如:+ab、+/*43-428。后綴表達式是運算符放在兩操作數的后面,如:ab+、43*42-/8+。

表達式求值是數學中的一個基本問題,也是程序設計中的一個常見問題。對于表達式的三種表示法,計算機可以采用不同的運算規則來求解。表達式的運算規則:先乘除,后加減,從左到右計算,先括號內,后括號外,即表達式運算不僅要依賴運算符優先級,還要處理括號,在計算機中操作很不方便。前綴表達式的運算規則:連續出現的兩個操作數和在它之前出現且緊靠它的兩個操作數構成一個最小表達式。后綴表達式的運算規則:每個運算符和在它之前出現且緊靠它的兩個操作數構成一個最小表達式。由此可見,后綴表達式中運算符出現的順序正是表達式的運算順序。因此,在對表達式求值時,通常先將表達式轉換成相應的后綴表達式,再對后綴表達式進行求值。

1 表達式轉換研究現狀

目前,表達式之間的轉換已有很多研究。如:文獻[1]介紹了利用兩個棧及括號法實現表達式轉換為后綴表達式的方法,但對括號轉換法的描述:“移動所有運算符來取代所有的右括號,并以最近為原則進行替換?!?,容易把運算符和右括號對錯位;文獻[2]介紹了利用棧和數組實現表達式轉換為后綴表達式的方法;文獻[3]和[7]介紹了利用二叉樹實現表達式轉換為后綴表達式的方法,但對轉換過程的描述不夠清楚;文獻[5]介紹了用兩個棧、加括號及語法樹實現表達式轉換為后綴表達式的方法,但文中對括號轉換法的描述:“將每個運算符移到其所在括號的外面?!?,沒有說明清楚運算符是移到括號的前面還是后面,容易產生歧義。因為運算符移到其所在的括號前面和后面得到的是表達式不同的表示形式;文獻[6]和[9]介紹了用一個棧實現表達式轉換成后綴表達式的方法;文獻[10]、[11]及[12]介紹了利用兩個棧實現中綴表達式轉換后綴表達式方法及后綴表達式的求值。

通過分析、對比目前表達式轉換成后綴表達式的各種方法,總結得出目前表達式轉換為后綴表達式的方法主要有:(1)利用兩個棧進行轉換;(2)利用一個棧進行轉換;(3)利用二叉樹進行轉換;(4)用(加)括號法進行轉換。但這些轉換方法不夠全面和完整,本文提出了這幾種轉換方法:(1)利用棧和隊列進行轉換;(2)加括號去括號進行轉換;(3)直接轉換;(4)二叉樹進行轉換。以期對表達式轉換為后綴表達式的方法進行補充和完善。

2 表達式轉換成后綴表達式的方法

2.1 利用棧和隊列進行轉換

將一個表達式(exp)轉換成后綴表達式,操作數之間的相對次序不變,但運算符的相對次序可能要變,同時還要去掉括號。文章根據表達式中運算符優先級、結合棧及隊列的特點,利用一個順序棧和一個順序隊列來實現表達式轉換為后綴表達式,其中順序棧S存儲運算符,順序隊列Q存儲中間結果,其具體轉換過程的偽代碼描述如下:

InitStack(S);

InitQueue(Q);

While(從exp讀取字符ch,ch!=’91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合