第四次作業

2022-03-09 02:07:44 字數 1912 閱讀 6545

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...