先把中綴表達式轉為後綴表達式,再入棧計算。
轉化主要遵循以下原則:1.遇到操作數,直接輸出;2.棧為空時,遇到運算符,入棧;3.遇到左括號,將其入棧;4.遇到右括號,執行出棧操作,並將出棧的元素輸出,直到彈出棧的是左括號,左括號不輸出, 左括號也要彈出;5.遇到其他運算符’+”-”*”/’時,彈出所有優先級大於或等於該運算符的棧頂元素,然後將該運算符入棧, 遇到左括號時不能再彈出;6.最終將棧中的元素依次出棧,輸出。經過上面的步驟,得到的輸出既是轉換得到的後綴表達式。舉例:a+b*c+(d*e+f)g ———> abc*+de*f+g*+
計算參照一下原則:
從左到右掃描後綴字符串, 遇到運算符則計算棧內的前兩個數,再把計算值填回去,直到結束。
1.輸入數字,則直接輸入到後綴字符串。2. 空棧時字符串直接入棧。3.遇到b c再輸出,遇到*因為優先級高,入棧。4.遇到加號,把棧內的高優先級運算符彈出。5.左括號入棧。6. 遇到d 直接輸出7.遇到*號, 入棧。8.遇到e 入棧9.+號優先級低, 所以把*號輸出10.遇到f 輸出b11f31a2ecee1b9067dab975bce8ee8111.遇到右括號,把+彈出,把(彈出刪掉。edaa4fda71648eee82d2272e2cbc3f2212.星號優先級高,入棧2ec907478b249ba46850ba872c2d3d5d13.數字輸出14.沒有字符後把棧內順序彈出
1.編譯過程中出現 Segmentation fault(core dumped), 一般是數組或者棧越界導致的; 或者是沒有正常return;2. 在pop的過程中註意判斷棧是否為空, 為空就不能繼續循環。
3.對STRING的操作要使用 str.push_back(); 或者 str+ =c; 不能使用數組賦值,因為不知道STR[]內存是多少,就會溢出。
4.先寫註釋,把每一步寫清楚。
5.調試也要寫進去,這樣方便定位。
具體代碼可以參閱我的Git
上一篇
下一篇