棧的運算式與波蘭運算式

來源:互聯網
上載者:User

棧的運算式與波蘭運算式

        棧的基本運算有三種,其中包括入棧運算、退棧運算以及讀棧頂元素,這些請參考相關資料結構資料。根據這些基本運算就可以用數組類比出棧來。 那麼作為棧的著名應用,運算式的計算可以有兩種方法。

        第一種方法—— 首先建立兩個棧,運算元棧OVS和運算子棧OPS。其中,運算元棧用來記憶運算式中的運算元,其棧頂指標為topv,初始時為空白,即topv=0;運算子棧用來記憶運算式中的運算子,其棧頂指標為topp,初始時,棧中只有一個運算式結束符,即topp=1,且OPS(1)=‘;’。此處的‘;’即運算式結束符。 然後自左至右的掃描待處理的運算式,並假設當前掃描到的符號為W,根據不同的符號W做如下不同的處理:

        1、 若W為運算元        

        2、 則將W壓入運算元棧OVS

        3、 且繼續掃描下一個字元

        4、 若W為運算子

        5、 則根據運算子的性質做相應的處理:

                (1)、若運算子為左括弧或者運算子的優先順序大於運算子棧棧頂的運算子(即OPS(top)),則將運算子W壓入運算子棧OPS,並繼續掃描下一個字元。

                (2)、若運算子W為運算式結束符‘;’且運算子棧棧頂的運算子也為運算式結束符(即OPS(topp)=’;’),則處理過程結束,此時,運算元棧棧頂元素(即OVS(topv))即為運算式的值。

                (3)、若運算子W為右括弧且運算子棧棧頂的運算子為左括弧(即OPS(topp)=’(‘),則將左括弧從運算子棧談出,且繼續掃描下一個符號。

                (4)、若運算子的右不大於運算子棧棧頂的運算子(即OPS(topp)),則從運算元棧OVS中彈出兩個運算元,設先後彈出的運算元為a、b,再從運算子棧OPS中彈出一個運算子,設為+,然後作運算a+b,並將運算結果壓入運算元棧OVS。本次的運算子下次將重新考慮。

 

 

        第二種方法—— 首先對錶達式進行線性化,然後將線性運算式轉換成機器指令序列以便進行求值。

        那麼什麼是運算式的線性化呢?人們所習慣的運算式的表達方法稱為中綴表示。中綴表示的特點是運算子位於運算對象的中間。但這種表示方式,有時必須藉助括弧才能將運算順序表達清楚,而且處理也比較複雜。 1929年,波蘭邏輯學家Lukasiewicz提出一種不用括弧的邏輯符號體系,後來人們稱之為波蘭標記法(Polish notation)。

        波蘭運算式的特點是運算子位於運算對象的後面,因此稱為尾碼表示。在對波蘭運算式進行運算,嚴格按照自左至右的順序進行。下面給出一些運算式及其相應的波蘭運算式。 運算式 波蘭運算式 A-B AB- (A-B)*C+D AB-C*D+ A*(B+C/D)-E*F ABCD/+*EF*- (B+C)/(A-D) BC+AD-/ OK,所謂運算式的線性化是指將中綴表達的運算式轉化為波蘭運算式。對於每一個運算式,利用棧可以把運算式變換成波蘭運算式,也可以利用棧來計算波蘭運算式的值。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.