2471 表示式的轉換

2021-07-01 20:47:34 字數 2217 閱讀 7461

題目描述 description

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

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

例如: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編寫乙個程式,完成這個轉換,要求輸出的每乙個資料間都留乙個空格。

輸入描述 input description

就一行,是乙個字尾表示式。輸入的符號中只有這些基本符號「0123456789+-*/^()

」,並且不會出現形如

2*-3

的格式。

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

形式的數字。

所輸入的字串不要判錯。

輸出描述 output description

若干個中綴表示式,第i+1行比第

i行少乙個運算子和乙個運算元,最後一行只有乙個數字,表示運算結果。

運算的結果可能為負數,「/

」以整除運算。

樣例輸入 sample input 8–

(3+2*6)/5+4

樣例輸出 sample output

8  3   2  6  *  +  5  /  –  

4  + 

8  3  12  +  5  /  –  

4  + 

8  15  5  /  –  

4  + 

8  3  –  

4  + 

5  4  + 

9分析:通過這個題目練習了編譯原理的一些內容。包括遞迴下降演算法,左遞迴的消除,語法制導翻譯的少部分內容。

通過遞迴下降轉換為字尾式,然後通過字尾式的計算方法來計算表示式,每次計算出乙個結果將整個字尾式輸出一次。

題目中要求的表示式消除左遞迴後為。

e->t1e1

e1->+t1e1 | -t1e1

t1->t2t11

t11->*t2t11 |  /t2t11

t2->t3t22

t22->^t3t22

t3->(e) | i             

然後編碼就很容易了,**如下。應為這個題目保證輸入都正確,因此沒進行出錯的提示。

#include #include #include #include using namespace std;

string str; //句子

int i = 0; //讀入字元的位置

listpostfix;

void t();

void e1();

void t1();

void t11();

void t2();

void t22();

void t3();

void g();

void f();

void s();

void e()

void e1()

else

e1(); }}

void t1()

void t11()

else if(str[ti] == '/')

t11(); }}

void t2()

void t22()

}void t3() // 終結符 或 ()

else if(str[i] == '(') }

}void print(list&operand)

for (list::iterator it = postfix.begin(); it != postfix.end(); ++it)

coutprint(operand);

for (;postfix.size() > 0;)

else

print(operand);

} }}int main()

codevs 2471 表示式的轉換 二叉樹

2471 表示式的轉換 題目描述 description 平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。字尾標記法 書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的...

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

算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...

表示式轉換

2 3 7 4 8 4 2 3 7 4 8 4 思路 a.若為 入棧 b.若為 則依次把棧中的的運算子加入字尾表示式中,直到出現 從棧中刪除 c.若為 除括號外的其他運算子,當其優先順序高於除 以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,...