算術表示式有字首表示法、中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。
輸入在一行中給出不含空格的中綴表示式,可包含+
、-
、*
、\
以及左右括號()
,表示式不超過20個字元。
在一行中輸出轉換後的字尾表示式,要求不同物件(運算數、運算符號)之間以空格分隔,但結尾不得有多餘空格。
2+3*(7-4)+8/4
2 3 7 4 - * + 8 4 / +
note:這一題比較注重細節方面的考察,有一些很容易忽視的點都要考慮到,具體是什麼且聽我娓娓道來。
首先,中綴表示式怎麼轉換為字尾表示式,兩個棧,乙個運算子棧,乙個輸出棧,進輸出棧就相當於輸出了:
逐個字元的讀取輸入的表示式
(1)讀到左括號「(」,直接存入運算子棧。
(2)讀到右括號「)」,將運算子棧中「(」前的所有運算子彈入輸出棧。
(3)讀到其他運算子,將該運算子和運算子棧棧頂運算子作比較:若其優先順序高於棧頂運算子優先順序,則直接存入運算子棧,
否則將棧頂運算子彈入輸出棧,如此迴圈直到棧頂運算子的優先順序小於讀到的運算子為止,再壓入運算子棧。
(4)讀取完表示式後,運算子棧中還有運算子時,則將所有運算子彈入輸出棧。
過程很簡單,為了方便,我分別用abcd表示「-」,「+」,「*」,「/」的,優先順序從小到大,這樣在判斷優先順序時可直接根據字元abcd的ascii碼值大小來比較。好,現在我來細講其中需要注意的細節。為什麼要注意這些細節,因為我們做題ac是乙個目的,同時能設計出更具通用性的演算法是更高層次的目的。當題目約束條件變多時,你的演算法是否能夠適應也是一項考驗,而不是單純地為了ac而寫出能ac的**。
(1)正負號:你的演算法要能正確判斷出正負號,正號如何處理?負號如何處理?結合數學知識想一下。比如2+(+5)。
(2)空格:題目對輸出格式有明顯的要求,你該怎麼設計這塊的輸出?哪些地方需要輸出空格?
(3)小數:遇到小數該怎麼處理?遇到指數科學計數法呢?最好的辦法就是當
(4)比較:在將運算子棧元素彈入輸入棧時,僅僅直到優先順序更小就停止嗎?還有限制條件嗎?
#include #include char stack[50], str[50], post[50]; // 符號棧,表示式字串,輸出棧
int top1 = -1, top2 = -1;
char pop( char c )
void compare( char c ) // 傳入字元來比較優先順序進而對stack執行相應的操作
stack[top1--] = '\0'; // 此時stack[top1]為左括號,直接彈出即可
}else // 如果是其他的操作符
stack[++top1] = c;
}}int main(void)
}while (top1 != -1) // 棧中剩餘運算子全部輸出
if (post[top2] == ' ')
post[top2--] = '\0'; // 如果結尾是多餘空格則刪除掉
printf("%s", post);
return 0;
}
自己試著不要看把**碼出來哦,測試樣例可以直接複製,加油小伙汁小改改,為了更美好的未來呢~~~ 表示式轉換 中綴表示式轉換為字尾表示式
算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入格式 輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。輸出格式 在一行中輸出轉換後的字尾表示式,...
表示式轉換
2 3 7 4 8 4 2 3 7 4 8 4 思路 a.若為 入棧 b.若為 則依次把棧中的的運算子加入字尾表示式中,直到出現 從棧中刪除 c.若為 除括號外的其他運算子,當其優先順序高於除 以外的棧頂運算子時,直接入棧。否則從棧頂開始,依次彈出比當前處理的運算子優先順序高和優先順序相等的運算子,...
表示式轉換
7 1 表示式轉換 25 分 算術表示式有字首表示法 中綴表示法和字尾表示法等形式。日常使用的算術表示式是採用中綴表示法,即二元運算子位於兩個運算數中間。請設計程式將中綴表示式轉換為字尾表示式。輸入在一行中給出不含空格的中綴表示式,可包含 以及左右括號 表示式不超過20個字元。在一行中輸出轉換後的字...