中綴轉字尾的手算方法:
(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 字尾表示式 中綴表示式 中綴記法 中綴表示式...