逆波蘭表示式也稱為字尾表示式,它將乙個算數表示式不包含括號,
運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行,如下圖所示:
在這裡我們可以運用棧的特點來實現字尾表示式,思路如下:
1.首先當遇到運算運算元時將其進行push操作;
2.當遇到操作符是將此時的棧pop兩次,先取出的棧頂為右運算元;
3.執行此方法到整個陣列遍歷完。
我們在這裡採用了陣列來儲存字尾表示式中的元素,因為如果用字串儲存的話,首先解析字串的時候會比較麻煩(既有數字還有字元),其次陣列的大小控制也比較方便。
利用列舉的方法將所要用到的運算子和運算元羅列出來
enum type
;
這樣方便我們後面的操作,可以在自由增減我們需要的運算方法。
#include#include#includeusing namespace std;
enum type
;struct cell
;int countrpn(cell _a, size_t _size)
//如果是操作符則先將當前棧頂元素取出
//再取出另乙個運算元做運算
//注意:先取出的數為右運算元(在減法和除法中要區分開來)
if (_a[i]._type == operator)
}} return s.top();
}int main()
, ,
, ,
, ,
, ,
, ,
};int ret = countrpn(rpnarray, sizeof(rpnarray) / sizeof(rpnarray[0]));
cout <
system("pause");
return 0;
}
執行結果如下:
寫在結尾:
本次程式設計需要注意理解逆波蘭表示式的意義,在儲存元素時候注意選擇用陣列而不是字串。
資料結構 棧應用之逆波蘭表示式(字尾表示式)
逆波蘭表示式含義我就不做贅述了,摘自百科上的一段話 逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為...
波蘭表示式和逆波蘭表示式(棧)
中綴表示式如1 2 2 1 其運算子一般出現在運算元之間,因此稱為中綴表示式,也就是大家程式設計中寫的表達 式。編譯系統不考慮表示式的優先級別,只是對表示式從左到右進行掃瞄,當遇到運算子時,就把其前面的兩 個運算元取出,進行操作。為達到上述目的,就要將中綴表示式進行改寫,變為字尾表示式 如上面的表示...
資料結構6 使用棧計算逆波蘭表示式
1 對於乙個逆波蘭表示式,需要判斷出哪些是數字 整型 浮點型 同時判斷出操作運算子,如何入棧呀?搜的方法,沒有說什麼來區分數字還是操作符 所以我想問題就是個渣渣!將所有的輸入都作為字元輸入!通過兩個迴圈判斷,外迴圈來判斷整個字串的結束 內迴圈利用空格來判斷結束 2 比較有意義的一點就是 比如,我原本...