題目描述 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.若為 除括號外的其他運算子,當其優先順序高於除 以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,...