計算機軟件

RPN:算法,方法和實例

RPN一旦形成一個電腦程序員在世界的基礎。 今天,它是不那麼廣為人知。 因此,漫畫插圖,描繪以外的“反向”波蘭香腸卷,仍然可以由一些知識淵博的程序員誤解。 不能很好地解釋了笑話,但在這種情況下,這將是完全合理的。

中綴

所有的程序員,和大多數學生都熟悉使用運營商。 例如,對於變量x和y使用加號表達式x +求和值。 少為人知的是,這是從數學符號,稱為中間符號借來的,其實是機器的一個大問題的事實。 這個操作符作為輸入接收兩個值都記錄在左側和右側。 在節目的符號與標誌操作可選擇使用。 例如,X + Y可被寫為倍(X,Y)的函數,其中,所述編譯器,並最終轉換綴表示法。 然而,大家都知道數學是太好不使用算術表達式,它形成一種內部小型的語言在幾乎所有的編程語言。

公式翻譯

第一真正成功的Fortran程序設計語言已經變得如此,主要是因為算術表達式(即式..)它在代碼轉換(廣播),它故名 - 公式翻譯。 在此之前,他們必須寫,例如,在函數的形式折疊(和乘(B,C))。 在實現自動轉換公式的COBOL問題被認為是非常困難的,因為程序員不得不寫東西喜歡A添加至B的Mutliply通過C.

什麼是錯的綴?

問題是,該運營商有這樣性質的優先級和結合。 正因為如此,中綴函數的定義變得不平凡的任務。 例如,乘法的優先級高於加法或減法,這意味著表達2 + 3 * 4不等於2和3的和,乘以4,因為這將是在運營商的性能從左到右。 事實上,乘以4 3,並添加2本實施例說明的是,綴表達式的計算通常需要在操作員和操作數的順序的改變。 此外,有必要使用大括號看起來更清晰的符號。 例如,(2 + 3)*(4 + 5)不能被沒有括號寫的,因為2 + 3 * 4 + 5意味著需要通過4乘以3,並添加2和5。

在要計算運營商的訂單需要一個漫長的記憶。 正因為如此,誰開始學習算術,往往學生得到錯誤的結果,即使實際操作正確執行。 有必要通過心臟教行動語句的順序。 首先,動作必須在括號,然後乘法和除法,最後加減進行。 但有寫數學表達式中綴表示法是唯一可以添加更多的可能的“小語種”之一的另一種方式。

前綴和後綴表示法

最知名的替代品二是之前或之後的操作數,記錄操作員。 他們被稱為前綴和後綴符號。 邏輯學家燕Lukasevich發明於1920年的第一個。 他住在波蘭,這樣的記錄被稱為波蘭。 Postfix的版本,分別稱為逆波蘭式(ARF)。 這兩種方法之間的唯一差別是,在其中讀取的記錄(從左至右或從右到左)的方向,所以它足以詳細只考慮其中的一個。 該OPN算它的操作數後寫的。 因此,表達式AB +表示為A + B.示例RPN

操作數的數量不受限制

符號的直接好處是,它總結了正進制運營商和中綴表示法實際上只有兩個操作數的作品,T。E.只對二進制操作本質上適合。 例如,ABC @是使用三元標記,是A,B和C的最大值。在這種情況下,操作者作用在三個操作數本身的左側和對應於一個函數調用@的逆波蘭表達式(A,B,C)。 如果您嘗試寫的@符號作為中綴,如A @ BC或類似的東西,它變得清晰,它根本不起作用。

通過如下順序優先

RPN具有另一個優點,所述運營商的優先級可以通過它們出現的順序來表示。 與此同時永遠不需要括號,但它們可以作為字符操作,以便於從綴表示法的轉換。 例如,AB + C * - 明確的當量(A + B)×C,所以乘法不能直到執行的相加,其給出用於乘法的第二操作數來計算。 也就是說,如果計算出的AB + C *通過一次一個操作員,我們得到AB + C * - >(AB +)* C - >(A + B)* C.

計算算法

OPN的操作看起來一樣需要作為參數的兩個值寫在她的左功能。 此外,它是用於在編程語言中使用的天然符號,作為其計算的方式對應於所述棧操作和需要解析被消除。 例如,在表達式5 + 6 * 7避雷器將顯示為5,6,7 *,+,它可以簡單地通過掃描從左至右被計算並且在堆疊寫的值。 每當操作的共同的標誌,由所述計算機存儲器的上部元件2中選擇,使用操作者和將結果返回到存儲器。 當計算表達式的最終結果將是在堆棧的頂部。

例如:

  • S =()5,6,7,*,+ 5放置在棧上。
  • S =(5)6,7,*,+ 6放置在棧上。
  • S =(5,6),7 *,7 +放置堆棧。
  • S =(5,6,7),* 2 +選擇從堆棧,使用*值,並將結果置於堆棧中。
  • S =(5,6 * 7)=(5,42)+從堆棧選擇的,以應用+和結果放在堆2的值。
  • S =(5 + 42)=(47)計算完成,結果被存儲在堆棧的頂部。

該算法可以反复檢查RPN,但每次它會工作,無論多麼複雜的算術表達式。

OPN和堆棧有著密切的聯繫。 該實施例證實了如何使用存儲器來計算逆波蘭表示法的值。 不太明顯的是,你可以使用堆棧,急性腎功能衰竭的轉換標準中綴表達。

編程語言的例子

帕斯卡RPN實現這樣的(示出了該程序的一部分)。

在被調用過程的週期,它決定是否令牌數或符號操作中讀取的數和運算符。 在第一種情況下,執行存儲在所述堆棧中的值,和兩個上堆疊號碼對應的動作的第二和的結果被存儲。

toktype:= NUM;

讀取(多個);

如果c在['+',' - ','*','/']然後開始

如果EOLN然後CN:=''別的讀(CN);

如果CN =''然後

的情況下,

'+':Toktype:=添加; ' - ':toktype:=子;

'*':Toktype:= MUL; '/':Toktype:= DIV

結束

別人開始

若a =' - '然後SGN:= -1否則錯誤:= C <>'+';

用:= CN

結束

結束;

如果(未誤差)和(toktype = NUM)然後getnumber;

如果toktype <> NUM然後開始

Y =彈出; X:=彈出;

如果沒有錯誤,則

的情況下toktype

添加:Z:= X + Y; 子:Z:= X-Y; MUL:Z:= X * Y; 格:Z:= x / y的

結束

推(Z);

C-實施RPN(程序的示出部分):

為(S = strtok的(S,W); S; S = strtok的(0,W)){

一個= strtod轉換(S,E);

如果(E> S)推(a)的

的#define rpnop(X)的printf(“%C:”,* S),B = pop()方法中,a = pop()方法,推(x)的

否則,如果(* S =='+')rpnop(A + B);

否則,如果(* S ==' - ')rpnop(一 - 二);

否則,如果(* S =='*')rpnop(A * B);

否則,如果(* S =='/')rpnop(A / B);

和#undef rpnop

}

硬件實現

在那些日子裡,當計算機技術是非常昂貴的,它被認為是一個好主意,迫使人們使用避雷器。 1960年當中。和現在一樣,有可能購買的計算器,這在逆波蘭式的工作。 要添加2,其中3必須輸入2,然後是3,然後按“加號”按鈕。 乍一看,輸入操作數的操作顯得複雜難記,但經過一段時間有些沉迷於這種思維方式和無法理解為什麼別人堅持愚蠢綴,這是如此複雜,如此有限。

巴勒斯公司甚至建立了一個主機,其中有沒有其他的內存,除了棧。 應用的算法和方法RPN到中央棧 - 這使得機器的唯一的事。 所有操作均視為避雷器運營商,它適用於高位n值。 例如,隊率先返回地址從堆棧的頂部,等等。D.這種機器的結構很簡單,但速度還不夠快與更常見的體系競爭。 然而,很多人仍然感到遺憾的是這樣一個簡單而優雅的方法來計算,每一個計劃是OPN的表達,發現其延續的事實。

與RPN一個時間計算器很受歡迎,有的人還在給他們的偏好。 此外,他們還開發出了面向堆棧的語言,如第四。 今天,它是很少使用的,但是從他的前用戶仍眷戀。

那麼,什麼是約逆波蘭香腸含義的笑話?

如果我們假設香腸的運營商,中綴符號,它應該是軋輥內,在傳統的熱狗。 該RPN坐落在兩半得到計算後準備在其間。 現在到了困難的部分 - 芥末。 她已經在香腸,T。E.已經計算為一元運算符。 據認為,芥菜也應顯示為未計算的,因此應該被移到了香腸的權利......但它是可能的,這需要過大疊......

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 zhtw.atomiyme.com. Theme powered by WordPress.