通常,按人的邏輯來說,計算四則運算的規律為:「先加減,後乘除,從左到右,先括號內後括號外。」例如:9+(3-1)*3+10/2,我們按上述的規律很快就可以算出結果:20。
但是老一點的計算機「看到」這個式子就會懵逼好久,在它們的邏輯裡,它們是以這樣的規律算這個式子的:9 3 1 - 3 * + 10 2 / +,第一次看到這個式子,你是不是也懵了,這就是我們今天要講的基於棧的一種應用:逆波蘭表示式計算。
逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家j.lukasiewicz於2023年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱為字尾表示。
(簡單的說就是:把運算量寫在前面,把算符寫在後面。)
中綴表示式:9+(3-1)*3+10/2
字尾表示式:9 3 1 - 3 * +10 2 / +
規則:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行計算,運算結果進棧,一直到最終獲得結果。
初始化乙個空棧。此棧用來對要運算的數字進出使用。
字尾表示式中前三個都是數字,所以9、3、1進棧。
接下來是「-」,所以講棧中的1出棧作為減數,3出棧作為被減數,並運算3-1得到2,再將2進棧。
接著是數字3進棧。
後面是「*」,也就意味著棧棧中3和2出棧,2與3相乘,得到6,並將6進棧。
下面是「+」,所以棧中6和9出棧,9與6相加,得到15,將15進棧。
接著是10與2兩數字進棧。
接下來是符號「/」,因此,棧頂的2與10出棧,10與2相除,得到5,將5進棧。
最後乙個是符號「+」,所以15與5出棧並相加,得到20,將20進棧。
結果是20出棧,棧變為空。
逆波蘭表示式 字尾表示式
字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前。比如 3 4 5 6中綴表示式就是常見的運算表示式,如 3 4 5 6字尾表示式又稱逆波蘭表示式,與字首表示式相似,只是運算子位於運算元之後,比如 3 4 5 6 人類最熟悉的一種表示式1 2,1 2 3,3 42 4等都是中綴表示法。對於人們...
逆波蘭表示式 中綴表示式 字尾表示式
1 我們這裡要實現的是 將中綴表示式轉換成字尾表示式,然後再計算最終結果,參考部落格。具體轉化演算法如下 中綴表示式a b c d e f g,其轉換成字尾表示式則為abc de f g 轉換過程需要用到棧,具體過程如下 1 如果遇到運算元,我們就直接將其輸出。2 如果遇到操作符,則我們將其放入到棧...
逆波蘭表示式 中綴表示式 字尾表示式
1 我們這裡要實現的是 將中綴表示式轉換成字尾表示式,然後再計算最終結果,參考部落格。具體轉化演算法如下 中綴表示式a b c d e f g,其轉換成字尾表示式則為abc de f g 轉換過程需要用到棧,具體過程如下 1 如果遇到運算元,我們就直接將其輸出。2 如果遇到操作符,則我們將其放入到棧...