中綴表示式求值(P1175 表示式的轉換)

2021-08-28 05:41:54 字數 1095 閱讀 8967

思路:先中綴表示式轉字尾,再對字尾表示式求值。

中綴表示式轉字尾:o(n)掃一遍輸入的中綴表示式:

1.遇到數:直接輸出

2.遇到左括號:左括號直接入棧。

3.遇到運算符號:利用建立的符號棧,棧內總原則為高階運算壓在低階運算之上。

4.遇到加、減、乘、除、乘方,按照正常的運算優先順序處理(可以看一下p1981 表示式求值)。從棧頂開始,將運算優先順序高於或等於待入棧符號的所有符號逐一出棧輸出,直到遇到棧內優先順序低於入棧符號的符號or左括號為止。

5.遇到右括號:持續進行出棧操作,輸出運算子,直至遇到左括號。

掃完後,將符號棧內所有剩餘符號出棧輸出。這時輸出的字串便為輸入的中綴表示式的字尾表示式。然後將字尾表示式直接進行運算即可。

ac**:

#include#include#includeusing namespace std;

const int maxn=105;

char charac[maxn];//charac:中綴轉字尾時用的運算子棧

int totc;

char ss[maxn];//ss:儲存中綴表示式

int first[maxn],len;//first:運算子優先順序

char last[maxn];//last:儲存字尾表示式

int ans[maxn],totl,cnt;//ans:求字尾表示式時儲存數字

int main()

charac[++totc]=ss[i];

} if(ss[i]==')')

//遇到右括號:持續進行出棧操作,輸出運算子,直至遇到左括號。

totc--;//左括號只出棧不輸出

} } for(int i=totc;i>=1;i--) last[++cnt]=charac[i];

for(int i=1;i<=cnt;i++) cout<'9')

totl--;

for(int j=1;j<=totl;j++) cout

} }

return 0;

}

洛谷P1175 表示式的轉換(表示式計算)

平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。字尾標記法 書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的處理規則簡化為 從左到右順序完成計算,並用結果取而代之。例...

中綴表示式求值

中綴表示式用於計算乙個表示式,比如計算器 就是這樣實現的 這兒是用棧的資料結構來實現的。首先輸入乙個字串,表示乙個表示式,然後用乙個棧儲存數字,另外乙個棧儲存符號 如果當前運算子優先順序比棧頂元素優先順序高,則入棧,若當前運算子優先順序小於等於棧頂運算子優先順序,則從數字棧中彈出兩個元素,從符號棧中...

中綴表示式求值

表示式求值都需要2個棧。乙個是符號棧,另乙個是數字棧。拿上面的字尾式45 來說,咱們剛才將表示式從4 5轉換到45 的過程是咱們一眼就能看出來的,但是計算機不能像咱們這樣做,因為他不會。他只會從表示式的開頭,順序掃瞄表示式的每乙個字元,它不能像咱們一樣 一眼就 看 出來。計算機是如何轉換的呢?1.從...