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