回覆列表
  • 1 # 使用者5321348306027

    ========================================================強烈要求知乎加入繪圖,GIF和Markdown語法支援========================================================逆波蘭表示式是一種利用棧來進行運算的數學表示式。以一個表示式 1 + 2 * 3 為例。以順序方式輸入這個表示式,計算機首先需要解析這個表示式,然後遞迴的求值。比如從左起進行順序解析,得到一個符號樹: + / \ 1 * / \ 2 3計算機會遞迴的從葉子開始求值,最後回到根,得出結果。所以對於一個比較複雜的表示式,樹可能會很深,而且遞迴的過程將會消耗大量的記憶體,由於有解析和運算兩個過程,時間開銷也不理想。如果將上式改為逆波蘭表示式: 3 2 * 1 +那麼就能實現 “線上處理”。線上處理必須是這類問題在計算機中最快的演算法。還是從左側開始,掃描這個表示式。掃描到第一項,為一個運算元,那麼可以把這個數壓棧,然後繼續掃面。

    3第二項還是一個運算元,同樣的壓棧繼續。23到第三項,得到一個雙目運算子,這時候計算機就從運算元棧中彈出兩個數作為運算子的兩個引數,然後進行運算,並將結果再壓回運算元棧。6接著第四項,一個運算元,壓棧。第五項,又是一個雙目運算子,那麼彈出兩個運算元進行運算,把結果壓棧。16到此,這個表示式就掃描結束了,運算元棧中最後會剩下表達式的運算結果。7不需要兩次操作,只要從頭掃描到尾就能求出結果,也不需要遞迴,只需要一個很小的棧就可以。所以逆波蘭表示式演算法取得了時間複雜度和空間複雜度上的雙重優勢。並且:從左到右掃描,有運算子就運算,對於複雜的表示式,不容易出錯;棧可以自動的記錄中間結果;機器只需要維護一個運算元堆疊,棧中只有運算元和結果所以在機器上實現起來非常的方便。早期,處理器效能比較弱的時候,使用這種方式就可以在效能不足的機器上實現任意複雜度的表示式運算。很棒吧。至於你的問題,主要是在於“為啥我的汽車不能飛”,很簡單,因為不支援。使用一種軟體的時候需要按照軟體提供的功能來操作,程式語言也是一種軟體系統,如果你想在這裡面使用逆波蘭表示式,那麼需要軟體提供對逆波蘭表示式的支援。對於程式語言,就是語法級的支援。編譯器在編譯時怎麼實現的我沒有研究過。但是對於常數值,在編譯時就可以確定,對於變數,我想還是和平臺相關吧。對於暫存器比較少的平臺,有可能會把表示式的運算序列化成一個逆波蘭表示式。只是有可能,沒有研究過編譯器的實現。應用主要是任何基於棧的程式語言,計算機(相當大一部分工程計算機都是基於棧的)。

  • 中秋節和大豐收的關聯?
  • 狗被嚇到後會出現抽搐現象嗎?