鬱悶的C小加(一)

2021-08-19 21:10:50 字數 1630 閱讀 6838

我們熟悉的表示式如

a+b、

a+b*(c+d)

等都屬於中綴表示式。中綴表示式就是(對於雙目運算子來說)操作符在兩個運算元中間:

num1 operand num2

。同理,字尾表示式就是操作符在兩個運算元之後:

num1 num2 operand

。acm

隊的「c

小加」正在鬱悶怎樣把乙個中綴表示式轉換為字尾表示式,現在請你設計乙個程式,幫助

c小加把中綴表示式轉換成字尾表示式。為簡化問題,運算元均為個位數,操作符只有

+-*/ 

和小括號。

第一行輸入t,表示有t組測試資料(t<10)。

每組測試資料只有一行,是乙個長度不超過1000的字串,表示這個表示式。這個表示式裡只包含+-*/與小括號這幾種符號。其中小括號可以巢狀使用。資料保證輸入的運算元中不會出現負數。並且輸入資料不會出現不匹配現象。

每組輸出都單獨成行,輸出轉換的字尾表示式。
2

1+2(1+2)*3+4*5

12+

12+3*45*+

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

與轉換為字首表示式相似,遵循以下步驟:

(1) 初始化兩個棧:運算子棧s1和儲存中間結果的棧s2;

(2) 從左至右掃瞄中綴表示式;

(3) 遇到運算元時,將其壓入s2;

(4) 遇到運算子時,比較其與s1棧頂運算子的優先順序:

(4-1) 如果s1為空,或棧頂運算子為左括號「(」,則直接將此運算子入棧;

(4-2) 否則,若優先順序比棧頂運算子的高,也將運算子壓入s1(注意轉換為字首表示式時是優先順序較高或相同,而這裡則不包括相同的情況

);

(4-3) 否則,將s1棧頂的運算子彈出並壓入到s2中,再次轉到(4-1)與s1中新的棧頂運算子相比較;

(5) 遇到括號時:

(5-1) 如果是左括號「(」,則直接壓入s1;

(5-2) 如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,直到遇到左括號為止,此時將這一對括號丟棄;

(6) 重複步驟(2)至(5),直到表示式的最右邊;

(7) 將s1中剩餘的運算子依次彈出並壓入s2;

(8) 依次彈出s2中的元素並輸出,結果的逆序

即為中綴表示式對應的字尾表示式**換為字首表示式時不用逆序)。

**:

#include#include#include#include#include#include#includeusing namespace std;

char x[1005];

mapmp;

void init()

s1.pop();

}else if(x[i]=='('||s1.empty())

s1.push(x[i]);

else

s1.push(x[i]);}}

}while(!s1.empty())

while(!s2.empty())

printf("\n");

}int main()

return 0;

}

鬱悶的C小加(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...

nyoj 257鬱悶的c小加(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...

NYOJ 257 鬱悶的C小加(一)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 我們熟悉的表示式如a b a b c d 等都屬於中綴表示式。中綴表示式就是 對於雙目運算子來說 操作符在兩個運算元中間 num1 operand num2。同理,字尾表示式就是操作符在兩個運算元之後 num1 num2 ope...