問題來由:
讀入乙個字串形式的四則運算表示式,輸出對應的計算結果。如讀入的是「6 * ( 5 + ( 2 + 3) * 8 + 3)」,那麼解析後的輸出結果應為288。
思路:一般的計算過程是這樣的,首先計算優先順序最高的小括號裡面的內容,即「( 5 + ( 2 + 3) * 8 + 3)」,
將「2 + 3」的計算結果並存為a,接著用計算「a*8」,並存為b
計算「5+b+3」,結果存為c
最後計算「6*c」,計算完畢
我們可以將這種操作順序書寫如下:
6 5 2 3 + 8 * + 3 + *
這個記法就是逆波蘭(reverse polish)表示式,其求值過程恰好就是上面所描述的過程。逆波蘭表示式又叫做字尾(postfix)表示式。在通常的表示式中,運算子總是置於與之相關的兩個運算物件之間,所以,這種表示法也稱為中綴表示。波蘭邏輯學家 j.lukasiewicz於2023年提出了另一種表示表示式的方法。按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。
計算字尾表示式最簡單的方法就是使用乙個棧:
下面演示下「6 5 2 3 + 8 * + 3 + *」的處理過程
首先讀到 6 5 2 3 四個數字,沒啥說的,直接打入棧中(6 5 2 3)
讀到運算子「+」,從棧中彈出兩個數字「3」、「2」,計算 3+2 = 5,將計算結果壓入棧中;(6 5 5)
讀到8,壓入棧(6 5 5 8)
讀到「*」,從棧中彈出兩個數字「8」、「5」,計算 8 * 5 = 40,將計算結果壓入棧中;(6 5 40)
讀到「+」,從棧中彈出兩個數字「40」、「5」,計算 40 + 5 = 45,將計算結果壓入棧中;(6 45)
讀到3,壓入棧(6 45 3)
讀到「+」,從棧中彈出兩個數字「3」、「45」,計算 3 + 45 = 48,將計算結果壓入棧中;(6 48)
讀到「*」,從棧中彈出兩個數字「48」、「6」,計算 48 * 6 = 288,計算完畢!!!
計算乙個字尾表示式話費的時間是o(n),該演算法的計算非常簡單,同時不需要知道任何的計算優先順序。
那麼現在的問題就是如何將乙個正常的表示式轉換為字尾表示式???
且看下回分解。
java解析字串表示式 逆波蘭表示式的計算
上回合我們講了如何將中綴表示式轉換成逆波蘭表示式,這回合我們講一講如何計算逆波蘭表示式。結合這一回合和上一回合,我們將能夠實現這樣乙個功能 計算乙個中綴表示式的結果!話不多說,走起來!讀入乙個字串形式的四則運算表示式,輸出對應的計算結果。如讀入的是 6 5 2 3 8 3 那麼解析後的輸出結果應為2...
波蘭表示式 逆波蘭表示式
中綴表示式是最常見的運算表示式,如 3 5 2 6 1 波蘭表示式又稱為字首表示式,它是由中綴表示式經過一定的方式轉換來的 比如中綴表示式為 3 5x 2 6 1 對應的字首表示式為 3 x 5 2 6 1 對於中綴表示式從右向左遍歷轉換為字首表示式,中途要是用棧進行儲存 轉換規則如下 波蘭表示式 ...
波蘭逆波蘭表示式
實現乙個基本的計算器來計算簡單的表示式字串。表示式字串只包含非負整數,算符 左括號 和右括號 整數除法需要 向下截斷 你可以假定給定的表示式總是有效的。所有的中間結果的範圍為 231,231 1 class solution s2.push s.substr l,r l l r 碰見符號 else ...