天天看點

【資料結構與算法】中綴表達式轉字尾表達式以及字尾表達式的計算

1️⃣ 如果遇到操作數,我們就直接将其輸出。

2️⃣ 如果遇到操作符,則我們将其放入到棧中,遇到左括号時我們也将其放入棧中。

3️⃣ 如果遇到一個右括号,則将棧元素彈出,将彈出的操作符輸出直到遇到左括号為止。注意,左括号隻彈出并不輸出。

4️⃣ 如果遇到任何其他的操作符,如(“+”, “*”,“(”)等,從棧中彈出元素直到遇到發現更低優先級的元素(或者棧為空)(或發現最近的左括号)為止。彈出完這些元素後,才将遇到的操作符壓入到棧中。有一點需要注意,隻有在遇到" ) "的情況下我們才彈出" ( ",其他情況我們都不會彈出" ( "。

5️⃣ 如果我們讀到了輸入的末尾,則将棧中所有元素依次彈出。

1️⃣ 先按照運算符的優先級對中綴表達式加括号,變成((a + (b * c)) + (((d * e) + f) * g ))

2️⃣ 将運算符移到括号的後面,變成((a(bc) * )+(((de) * f) + g) * ) +

3️⃣ 去掉括号,得到 abc *+ de * f + g *+

字尾表達式也叫逆波蘭表達式。

逆波蘭表達式嚴格遵循「從左到右」的運算。計算逆波蘭表達式的值時,使用一個棧存儲操作數,從左到右周遊逆波蘭表達式,進行如下操作:

如果遇到操作數,則将操作數入棧;

如果遇到運算符,則将兩個操作數出棧,其中先出棧的是右操作數,後出棧的是左操作數,使用運算符對兩個操作數進行運算,将運算得到的新操作數入棧。

整個逆波蘭表達式周遊完畢之後,棧内隻有一個元素,該元素即為逆波蘭表達式的值。