棧應用2(中綴表示式轉換成字尾表示式)-筆記
問題:如何使用棧來實現將中綴轉換為字尾表示式的演算法?
解答:在討論演算法前,首先介紹中綴、字首和字尾表示式的定義
中綴:中綴表示式由一個單一字元或運算子,連線前後兩個中綴字串共同組成。
A
A+B
(A+B)+(C+D)
字首:字首表示式由一個單一字元或運算子,隨後是兩個字首字串共同組成。每個字首字串長度大於1,包含一個運算子、第一個運算元和第二個運算元。
A
+AB
++AB-CD
字尾:字尾表示式(逆波蘭表示式)由兩個字尾字串,隨後是一個單一字元或運算子共同組成。每個字尾字串長度大於1,包含第一個運算元和第二個運算元,隨後是一個運算子。
A
AB+
AB+CD-+
字首和字尾表示式是無需括號描述數學表示式的方法。計算字尾和字首表示式的時間開銷是O(n),n是陣列中元素的個數。
下表給出了運算子之間的優先順序和相關性(計算的先後順序)
重要性質
a.仔細比較中綴表示式2+3*4和字尾表示式2 3 4 + *,可以發現兩種表示式中數字(運算元)的次序是相同的,都是2 3 4。但是運算子 *和(+)的次序在兩個表示式中是不同的。
b.只需一個棧就可以把中綴表示式轉換成字尾表示式。利用棧把表示式中運算子的次序從中序改編成後序。棧中僅儲存運算子和左括號‘(’。由於字尾表示式中不包含括號,所以輸出字尾表示式時將不輸出括號。
演算法:
a.建立一個棧
b.for(輸入字串中的每個字元t){
if(t 是一個運算元)輸出t
else if(t 是一個有括號)
}
出棧並輸出該符號,直至一個左括號出棧(但左括號不輸出)
else //t 是一個運算子或左括號{
出棧並輸出該符號,直至出現一個比t的優先順序小的符號,或者出現一個左括號,或者棧空
t入棧
}
}
c.出棧並輸出該符號,直至棧空
為了更好地理解上述轉換演算法,給出表示式A*B-(C+D)+E的具體執行過程