github鏈結位址
計算看了題目本來是一頭霧水,後來看了大神推薦的字首中綴字尾表示式才有了頭緒,先轉換,後計算。他人思路如下:
接下來是自己的(對負數處理)轉換思路:將優先順序高的運算甩在前面,同級先出現在前面。
具體實現:以後綴表示式為例。
1.初始化棧1(儲存字尾表示式),棧2(運算子的中轉站),從左到右掃瞄算式。
2.數字直接進1。
3.運算子進2,但是符號進去之前判斷優先順序.
3-1.如果棧裡面高或者**相等**就彈出並壓入1,繼續比較。這樣在表示式中優先順序高的符號先出現,先運算。同級先出現,先進表示式。
3-2.如果棧為空,或者棧頂元素優先順序或者為「(」,直接進2。
4.括號進2。
4-1.「(」直接進2。
4-2.「)」出現要把它們之間運算子全部彈出並進1,這樣括號裡面的運算也先進表示式,括號任務完成,可以不要了。
5.表示式掃瞄完以後,將2內元素依次彈出並壓入1
計算方法:掃瞄字尾表示式(先進先掃)。
1.遇見數字進棧。
2.遇見運算子就把棧前兩個元素拉出來運算,結果再進棧。
最後棧頂元素即為所得算式結果
舉個例子 `1+2*(3+4)-5` 。字尾表示式:(棧底到棧頂)`1 2 3 4 + * + 5 - `按照運算規則就是`1+2*(3+4)-5`
**1.因為scan得到的是佇列,正好從左到右,所以選擇轉換成字尾
2.選擇用佇列而不是棧來儲存字尾表示式,因為轉換的時候只進不出而最後計算需要先進先掃,毫無疑問,佇列更合適
3.想了下,出現負數有兩種情況。
3-1.在算式開頭,運算時把0壓進棧,這樣計算-a就相當於0-a。
3-2.在左括號右邊,這樣在輸入「(」時,加乙個判斷,如果下乙個元素為「-」,就把0壓進字尾表示式。
轉換成字尾表示式
計算字尾表示式void calculation::trans(queue*s)
sign.push(c);
s->pop();
}if (c == "+" || c == "-")
sign.push(c);
s->pop();
}//為括號時
if (c == "(")
}//將括號間運算子彈出並壓入字尾表示式,括號捨棄
if (c == ")")
sign.pop();
s->pop();
}//數字直接進棧
else if (isdigit(c[0]))
}//運算子全部進字尾表示式
while (sign.empty() == false)
}
命令列double calculation::count()
if (c == "-")
if (c == "*")
if (c == "/")
//數字直接存入棧中
else if (isdigit(c[0]))
after.pop();
}//棧頂元素為最終運算結果
return num.top();
}
怎麼說呢,現在還不是太懂,而且它坑了我很久,一開始執行了是這樣的
之後我怎麼改**都沒用,後來無意間少寫了一句,執行之後還是輸出了結果,我就知道不是**的問題,我就重新建了乙個專案,最後成功輸出了,截圖如下:
意外狀況
第四次作業
扎ogu 典型產品 最高傳輸速率 ieee 802.11a wi fi5 802.11a 43m 450 zyxel p334u 54mbps 1500 zyxel p335u 54mbps 1600 ieee 802.11b d link di 624 a 54mbps 215 linksys w...
第四次作業
作業題一 vs2012 rc在介面上,比beta版更容易使用,彩色的圖示和按照開發 執行 除錯等環境區分的顏色方案讓人愛不釋手。vs2012整合了asp.net mvc 4,全面支援移動和html5,wf 4.5相比wf 4,更加成熟,期待已久的狀態極工作流回來了,更棒的是,現在它的設計器已經支援c...
第四次作業
專案一求1000以內所有偶數的和 includevoid main cout sum includevoid main while i 1000 cout sum includeint main while i 1001 cout 專案3 乘法口訣表 程式設計序,輸出乙個乘法口訣表,形如 1x1 1...