關於字尾 中綴 字首表示式的小結

2022-03-29 13:56:42 字數 3653 閱讀 5012

這個表示式計算是我好早之前學的 但是昨天聽完 我一瞬間竟然忘了這東西怎麼寫 又翻了翻** 想起來了 不如寫下來

為什麼會出現字首 字尾 中綴的形式 是因為 我們在計算表示式的時候 實際上可以看做是乙個插入一棵樹上 然後對應這個樹上的前序 後序 中序的乙個遍歷順序 

那麼不同的 遍歷順序  表示式計算方式也會有所不同 我們這裡講一下 前字尾表示式的計算 以及如何將中綴轉化為字尾 在進行計算 這是一般做法

應該都知道 表示式計算都要搞乙個棧 別說了 我不信你不知道; 

介紹概念 中綴表示式(中綴記法)我們最常寫的式子 中綴表示式是一種通用的算術或邏輯公式表示方法,

操作符以中綴形式處於運算元的中間。

雖然人的大腦很容易理解與分析中綴表示式,但對計算機來說中綴表示式卻是很複雜的,

因此計算表示式的值時,通常需要先將中綴表示式轉換為字首或字尾表示式,

然後再進行求

值。對計算機來說,計算字首或字尾表示式的值非常簡單。

字首表示式(字首記法、波蘭式)字首表示式的運算子位於運算元之前。

字首表示式的計算機求值:

從右至左掃瞄表示式,遇到數字時,將數字壓入堆疊,遇到運算子時,彈出棧頂的兩個數,用運算子對它們做相應的計算(棧頂元素 op 次頂元素),並將結果入棧;

重複上述過程直

到表示式最左端,最後運算得出的值即為表示式的結果。

例如字首表示式「- × + 3 4 5 6」:

(1) 從右至左掃瞄,將6 5 4 3壓入堆疊;

(2) 遇到+運算子,因此彈出3和4(注意棧的應用 此時3 4是棧頂),計算出3+4的值,得7,再將7入棧;

(3) 接下來是×運算子,因此彈出7和5,計算出7×5=35,將35入棧;

(4) 最後是-運算子,計算出35-6的值,即29,由此得出最終結果。

然後我們考慮 字尾表示式的計算

與上面稍有不同 我們從左向右依次便利這個表示式 遇到是數字就進棧 遇到是符號 就將處於棧頂兩個數字出棧 進行運算

運算結果進棧 一直到最終獲得結果

字尾表示式也叫做 逆波蘭表示式 這樣的式子的特點 是沒有 括號的 所以我們直接模擬就可以了

但是我們在這裡要討論一下 中綴表示式的計算

也就是 我們最常寫的式子 但是 計算起來 我們有兩個方法 將其轉化成 字首表示式 或者轉化成 字尾表示式 在按照上面的 方式 計算 這裡說一

下 轉化為字尾表示式

先說一下 怎麼轉化 這裡我們假定 只有小括號 只有整數 輸入合法 例如:

中綴表示式為:1+(2-3)*4+4/2

對應字尾表示式為:1 2 3 - 4* + 4 2 / +

如何將乙個中綴表示式轉化為字尾表示式?我們需要借助棧,用它來存放運算子。

首先將各種運算子(包括括號)的優先順序排列如下(數字越大,優先順序越高):

1:  ( 要注意的是 小括號優先順序是最低的qwq

2:+ -

3:* /

4 :^

5:)這裡只考慮到有乘方的形式 

對輸入的中綴表示式從左到右遍歷:

1)如果遇到數字,直接新增到字尾表示式末尾;

2)如果遇到運算子+、-、*、/:

先判斷棧是否為空。若是,則直接將此運算子壓入棧。若不是,則檢視當前棧頂元素。若棧頂元素優先順序大於或等於此操作符級別,則彈出

棧頂元素,將棧頂元素新增到字尾表示式中,並繼續進行上述判斷。如果不滿足上述判斷或者棧為空,將這個運算子入棧。要注意的是,經

過上述步驟,這個運算子最終一定會入棧

3)如果遇到括號:

如果是左括號直接入棧。如果是右括號彈出棧中第乙個左括號前所有的操作符,並將左括號彈出

4)字串遍歷結束後,如果棧不為空,則彈出棧中所有元素,將它們新增到字尾表示式的末尾,直到棧為空。

通過上述過程 我們就得到了 這個中綴表示式 對應的字尾表示式 那麼 我們怎麼計算字尾表示式也清楚了 但是這種發現有點 麻煩 我們還要記

錄這個字尾表示式是什麼 

對於一些題目 不需要你輸出 字尾表示式 那我們考慮直接計算 不記錄這個字尾表示式 直接將兩步結合起來;

我們考慮開兩個棧 乙個數字棧 乙個符號棧 

我們讀入當前的中綴表示式 遇到數字 我們將其壓入數字棧 遇到符號 按照剛才的方式處理

對符號棧進行處理 對應優先順序的順序 也就是說 對於乙個操作符 

我們將優先順序大於等於當前符號的 都計算出來

方法類似於字尾表示式 

乙個符號 兩個數字 計算結果壓入棧中;

所以我們無需計算出具體的字尾表示式 直接計算即可;

鑑於寫文章的作者比較懶 所以以上都沒有** 不

過luogu上倒是有字尾表示式 以及簡單的中綴表示式計算的例題 如1449 但為啥都是普及-啊

所以 只有計算中綴的乙個題目 涉及 負數 多位數字的處理 以及加 減 乘 整除 乘方 括號 多種運算

給出乙個表示式,其中運算子僅包含+,-,*,/,^(加 減 乘 整除 乘方)要求求出表示式的最終值。

資料可能會出現括號情況,還有可能出現多餘括號情況。

資料保證不會出現大於或等於2

31'>231

的答案。

資料可能會出現負數情況。

輸入格式

輸入僅一行,即為表示式。

輸出格式

輸出僅一行,既為表示式算出的結果。

輸入樣例:

(2+2)^(1+1)
輸出樣例:
16
我們按照上面的思路來一遍就好了 注意好好處理數字 

#includeusing

namespace

std;

stack

num;

stack

ops;

inline

int mul(int a,int k)

void cal()

intmain()

num.push(t);

//處理多位數字的情況 題目並沒***是10以內的數字

i=j-1

; }

else

num.push(-t);

i=j-1

; }

else

}else

if(c=='

*'||c=='/'

)

else

if(c=='^'

)

else

if(c==')'

)

else

cout

<<"

sbsbsbsb

"<}

}cout

return0;

}

字首 中綴 字尾表示式

它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...

字首 中綴 字尾表示式

最近筆試的過程中老是有中綴轉換為字首,或是中綴轉換為字尾的問題,資料結構學了這麼久真的是記不清了,今天重新複習了一下,藉此機會總結一下 中綴 我們正常理解的表示式的書寫方式 字首 操作符全部位於運算元的前面,運算元的順序為從右到左依次壓棧的順序,操作符為從左到右依次壓棧的順序 字尾 不包含括號,運算...

字首 中綴 字尾表示式

它們都是對表示式的記法,因此也被稱為字首記法 中綴記法和字尾記法。它們之間的區別在於運算子相對與運算元的位置不同 字首表示式的運算子位於與其相關的運算元之前 中綴和字尾同理。舉例 3 4 5 6 就是中綴表示式 3 4 5 6 字首表示式 3 4 5 6 字尾表示式 中綴表示式 中綴記法 中綴表示式...