1. 程式人生 > >字尾表示式和中綴表示式的轉換

字尾表示式和中綴表示式的轉換

何為字尾表示式

不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行(不再考慮運算子的優先規則,如:(2 + 1) * 3 , 即2 1 + 3 *

很好理解,就是一個符號只對其前面兩個數作用

字尾表示式和中綴表示式的轉換

如A+B*(C−D)−E/F

這是怎麼搞出來的呢??

選最靠中的那個優先順序最低的符號開始(±),把算數式分為2個部分,若符號數大於二,樹的左兒子是左邊的符號,右兒子是右邊的符號,若符號不夠兩個,那麼就把數字或字母放在相應的位置。然後又在這兩個部分裡進行同樣的操作。

然後,樹建好之後,對它進行一次後序遍歷,將每個節點的值寫出即可。

什麼是後序遍歷?就是先遍歷左子樹,再遍歷右子樹,最後遍歷根節點的一種遍歷順序。

相應的有:

中序遍歷(先遍歷左子樹,然後訪問根結點,最後遍歷右子樹),可以得到相應的中綴表示式(就是一般算數式)

前序遍歷(先訪問根結點然後遍歷左子樹,最後遍歷右子樹),字首表示式(將運算子寫在前面,運算元寫在後面的表示式,也叫波蘭式)

於是A+B*(C−D)−E/F的字尾表示式就是ABCD-*+EF/-

字首表示式就是-+A*B-CD/EF(字首表示式在不確定中綴表示式的情況下不唯一)

當中綴表示式和字首表示式確定時才可以確定字尾表示式,同理,當中綴表示式和字尾表示式確定時才可以確定字首表示式

還有一種用棧的方式,直接給連結了:

原表示式轉換為字尾表示式