中綴 字尾 字首表示式

2021-10-19 10:02:26 字數 2329 閱讀 4134

中綴轉字尾的手算方法:

(1)確定中綴表示式中各個運算子的運算順序

(2)選擇下乙個運算子,按照【左運算元 右運算元 運算子】的方式組合成乙個新的運算元

(3)如果還有運算子沒被處理,就繼續(2)

a+b*(c-d)-e/f

(1)先算c-d,轉成字尾就是cd-,把它看作乙個新的運算元firstcal:a+b*firstcal-e/f

(2)再算b*(c-d),即b*firstcal,轉成字尾即bfirstcal*,把firstcal展開,就是bcd-*

(3)依次類推,接下來a(bcd-*)+,然後a(bcd-*)+(ef/)-,於是最終的字尾表示式就是abcd-*+ef/-

由於運算的次序並不唯一,所以最終的字尾表示式也並部唯一。

但是如果要編寫中綴轉字尾的演算法,那麼採用「左優先」原則——只要左邊的運算子能先計算,就優先計算左邊的。

採用「左優先」原則生成的字尾表示式,它的運算子的生效次序就是從左到右依次生效的。

當採用字尾表示式進行運算時,棧先彈出的是右運算元,後彈出的是左運算元

中綴轉字首的手算方法:

(1)確定中綴表示式中各個運算子的運算順序

(2)選擇下乙個運算子,按照【運算子 左運算元 右運算元】的方式組合成乙個新的運算元

(3)如果還有運算子沒被處理,就繼續(2)

a+b*(c-d)-e/f

(1)先算c-d,轉成字首就是-cd,把它看作乙個新的運算元firstcal:a+b*firstcal-e/f

(2)再算b*(c-d),即b*firstcal,轉成字首即*bfirstcal,把firstcal展開,就是*b-cd

(3)依次類推,接下來+a(*b-cd),然後-+a(*b-cd)(/ef),於是最終的字首表示式就是-+a*b-cd/ef

採用「右優先」

+a-*b-cd/ef

右優先原則:只要右邊的運算子能先計算,就優先算右邊的。

但是如果要編寫中綴轉字首的演算法,那麼採用「右優先」原則——只要右邊的運算子能先計算,就優先計算右邊的。

採用「右優先」原則生成的字首表示式,它的運算子的生效次序就是從右到左依次生效的。

採用字首表示式進行計算,先彈出的是左運算元

初始化乙個棧,用於儲存暫時還不能確定順序的運算子

從左到右處理各個元素,直到末尾。可能遇到三種:

(1)遇到運算元。直接加入字尾表示式

(2)遇到界限符。遇到「(」直接入棧;遇到「)」則依次彈出棧內運算子,直到彈出「(」為止。

(3)遇到運算子。依次彈出棧中優先順序高於或等於當前運算子的所有運算子

對於棧來說,棧頂的輸出優先順序比棧底高,所以,對於優先順序較低的操作符,應該放在棧底,優先順序較高的操作符應該放在棧頂。

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

int priority;

priority isinstack

(char oprmark)

;priority isoutstack

(char oprmark)

;int pos[20]

=;intmain()

}else

//對於操作符則把它壓入堆疊中,對於任意兩個操作符之間的數值則放入陣列中

else

else

stoperator.

push

(strexpression[iend]);

//如果棧空了,或者棧頂操作符的優先順序比它小則把把這個操作符入棧}}

++iend;}}

while

(!stoperator.

empty()

)//把棧中操作符都放入陣列中

for(

int i =

0; i < vecpostfix.

size()

;++i)

return0;

}priority isinstack

(char oprmark)

//棧內符號的優先順序

}priority isoutstack

(char oprmark)

//(棧外的)表示式符號的優先順序

}

字首 中綴 字尾表示式

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

字首 中綴 字尾表示式

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

字首 中綴 字尾表示式

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