資料結構學習 中綴表示式轉字尾表示式

2021-06-20 09:36:47 字數 1258 閱讀 7301

本題所描繪的中綴轉字尾,只是很簡單的轉。並不能達到寫計算器的目的,本文在此只用於個人的基礎鞏固,以及淺層次的思考,幫助進行中綴表示式轉字尾表示式的理解。

中綴表示式如1*2+(2-1),其運算子一般出現在運算元之間, 因此稱為中綴表示式,也就是大家程式設計中寫的表示式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄, 當遇到運算子時, 就把其前面的兩個運算元取出,進行運算操作。為達到上述目的, 就要將中綴表示式進行改寫,變為字尾表示式, 如上面的表示式1*2+(2-1),就變為12*21-+。

字尾表示式中不含有括號,且字尾表示式中的運算元排列次序和中綴表示式完全相同,這是運算子的次序發生了變化。我們實現的時候,便需要特定的資料結構(棧:stack),進行實現。

其中的stackop進行操作符的儲存。string ans用來存放字尾表示式。

接下來簡述演算法思想:

1)如果是『(』則直接壓入op棧。

2)如果是『)』,依次從op棧彈出運算子加到字串ans的後面,直到遇到 '('。

3)如果不是括號,則比較掃瞄到的運算子與op棧頂的運算子。如果掃瞄的運算子優先順序高於棧頂運算子的優先順序,便把掃瞄到的運算子壓入棧中。若掃瞄的運算子優先順序低於棧頂運算子的優先順序,就依次把棧中運算子彈出加到字串ans末尾,直到遇到的運算子優先順序低於掃瞄到的運算子或者棧空,並把掃瞄到的運算子壓入棧中。

若掃瞄結束,則依次彈出新增到ans的末尾,便得到了字尾表示式。

**如下:

#include#include#includeusing namespace std; 

int prior(char op) //運算子優先順序

else if(op == '*' || op == '/')

return 0;

}string middletolast(string middle)

else

else

op.pop(); //遇到了匹配的 '(' 跳出迴圈,並把'('彈出

}else

else

else

op.push(c); //把當前運算子壓入棧中 }}

}}} }while( !op.empty() ) //若棧非空

return ans;

}int main()

return 0;

}

資料結構學習 中綴表示式轉字尾表示式

表示式的三種形式 字尾表示式 不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則,如 2 1 3 字首表示式 同字尾表示式一樣,不包含括號,運算子放在兩個運算物件的前面,如 2 1 3,注意 2 1 對應的 中綴表示式是 2 1 而不是...

資料結構學習 中綴表示式轉字尾表示式(c )

表示式的三種形式 字尾表示式 不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則,如 2 1 3 字首表示式 同字尾表示式一樣,不包含括號,運算子放在兩個運算物件的前面,如 2 1 3,注意 2 1 對應的 中綴表示式是 2 1 而不是...

資料結構 中綴表示式轉字尾表示式

話不多說上例子 1 2 3 4 5 1 2 3 4 5 中綴表示式轉字尾表示式思路分析 1.首先需要兩個棧運算子棧 s1和儲存中間結果的棧 s2 2.從左至右掃瞄中綴表示式 2.1當前為運算元,將其壓棧至s2 2.2當前為運算子 2.2.1如果s1為空或者棧頂運算子為左括號 則將此運算子直接入s1棧...