逆波蘭運算式演算法

來源:互聯網
上載者:User

       將一個中序運算式轉化成為逆波蘭運算式的方法其實很簡單,也是一個成型的演算法。通過逆波蘭運算式求一個計算式子的值,也是很簡單的,只要遇到過會用就行了。

1、將一個中序運算式轉化成為逆波蘭運算式。

       首先維護的是兩個棧,我們這裡暫且稱為S1和S2,S1中的結果最後存的就是逆波蘭運算式,S2中將用於暫時存放運算子並且在最終形成逆波蘭運算式的時候,該棧是會清空的。下面我們看看怎樣具體的形成逆波蘭運算式。

       在此首先定義一下運算子的優先順序關係,從小到達排序,相同優先順序沒有用逗號隔開:(,+-,*\,負號,)。

       從左至右遍曆一個給定的中序運算式,也就是我們常規的數學計算的運算式。

(1)如果遇到的是數字,我們直接加入到棧S1中;

(2)如果遇到的是左括弧,則直接將該左括弧加入到棧S2中;

(3)如果遇到的是右括弧,那麼將棧S2中的運算子一次出棧加入到棧S1中,直到遇到左括弧,但是該左括弧出棧S2並不加入到棧S1中;

(4)如果遇到的是運算子,包括單目運算子和雙目運算子,我們按照下面的規則進行操作:

          (1)如果此時棧S2為空白,則直接將運算子加入到棧S2中;

          (2)如果此時棧S2不為空白,當前遍曆的運算子的優先順序大於等於棧頂運算子的優先順序,那麼直接入棧S2;

          (3)如果此時棧S2不為空白,當前遍曆的運算子的優先順序小於棧頂運算子的優先順序,則將棧頂運算子一直出棧加入到棧S1中,直到棧為空白或者遇到一個運算子的優先順序小於等於當前遍曆的運算子的優先順序,此時將該運算子加入到棧S2中;

(5)直到遍曆完整個中序運算式之後,棧S2中仍然存在運算子,那麼將這些運算子依次出棧加入到棧S1中,直到棧為空白。

       按照上面的五條操作反覆進行完成,那麼棧S1中存放的就是逆波蘭運算式。


2、利用逆波蘭運算式求值

       利用逆波蘭運算式求計算式的值其實很簡單,正式因為這一點,所以逆波蘭運算式才在編譯原理中被用於計算一個運算式的值。

       下面來具體看看如何求一個逆波蘭運算式的值:

       我們此時維護一個資料結果棧S3,我們將會看到該棧中最後存放的是最終的運算式的值。我們從左至右的遍曆棧S1,然後按照下面的規則進行操作棧S3.

(1)如果遇到的是數字,那麼直接將數字壓入到S3中;

(2)如果遇到的是單目運算子,那麼取S3棧頂的一個元素進行單目運算之後,將結果再次壓入到棧S3中;

(3)如果遇到的是雙目運算子,那麼取S3棧頂的兩個元素進行,首先出棧的在左,後出棧的在右進行雙目運算子的計算,將結果再次壓入到S3中。

       按照上面的三個規則,遍曆完整個棧S1,那麼最後S3中的值就是逆波蘭運算式的值了,所以我們可以看出來使用逆波蘭運算式進行求值是很簡單的,只有兩種操作要麼是直接壓棧,要麼是運算之後將結果壓棧。


       至此關於如何將一個中序運算式轉化成為逆波蘭運算式以及如何將一個逆波蘭運算式進行求值,都已經講清楚了。不知道上面的描述中有沒有什麼沒有講清楚或者由於口誤而沒有描述正確的,請明眼的讀者幫忙指正,先再次感謝了!


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.