Luogu1175 表示式的轉換 表示式樹

2022-05-02 05:24:10 字數 1431 閱讀 9685

平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。

字尾標記法:書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的處理規則簡化為:從左到右順序完成計算,並用結果取而代之。

例如:8-(3+2*6)/5+4可以寫為:8 3 2 6*+5/-4+

其計算步驟為:

8 3 2 6 * + 5 / – 4 +

8 3 12 + 5 / – 4 +

8 15 5 / – 4 +

8 3 – 4 +

5 4 +

9

編寫乙個程式,完成這個轉換,要求輸出的每乙個資料間都留乙個空格。

就一行,是乙個中綴表示式。輸入的符號中只有這些基本符號0123456789+-*/^(),並且不會出現形如2*-3的格式。

表示式中的基本數字也都是一位的,不會出現形如12形式的數字。

所輸入的字串不要判錯。

輸出格式

若干個字尾表示式,第 \(i+1\) 行比第 \(i\) 行少乙個運算子和乙個運算元,最後一行只有乙個數字,表示運算結果。

輸入輸出樣例

輸入 #1

8-(3+2*6)/5+4

輸出 #1

8 3 2 6 * + 5 / - 4 +

8 3 12 + 5 / - 4 +

8 15 5 / - 4 +

8 3 - 4 +

5 4 +

9

說明/提示

運算的結果可能為負數,\(/\) 以整除運算。並且中間每一步都不會超過 \(2^\),字串長度不超過 \(100\)。

一直欠缺前中字尾表示式的相關姿勢,之前只知道可以後表示式二叉樹遍歷來確定,其實還可以用棧來搞,利用運算子的單調性維護乙個單調棧,就可以通過中綴表示式算出字首/字尾表示式。

因為這個問題已經被研究了好多好多年了,網上資料也很多(似乎還是以後資料結構課的內容),所以這裡就貼一下我覺得海星的相關博文。

二叉樹的簡單應用--表示式樹

中綴表示式轉換為字首表示式

由淺入深表示式樹(一)建立表示式樹

主要就是按照第一篇博文的思路寫的。

**如下:

#includeusing namespace std;

string in,str;

inline int lu(char x)

inline int lv(char x)

inline void encode()

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

思路 先中綴表示式轉字尾,再對字尾表示式求值。中綴表示式轉字尾 o n 掃一遍輸入的中綴表示式 1.遇到數 直接輸出 2.遇到左括號 左括號直接入棧。3.遇到運算符號 利用建立的符號棧,棧內總原則為高階運算壓在低階運算之上。4.遇到加 減 乘 除 乘方,按照正常的運算優先順序處理 可以看一下p198...

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

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

洛谷 P1175 表示式的轉換

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