[命題人 : 外部匯入]
時間限制 : 1.000 sec 記憶體限制 : 32 mb
解決: 1817
提交: 4382統計
題目描述
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
樣例輸入 copy
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
樣例輸出 copy
12178.21
提交
中綴表示式轉字尾表示式:
1、設立乙個操作符棧s,用來暫時存放操作符;設立乙個陣列或者佇列q,用來存放字尾表示式;
2、從左往右掃瞄中綴表示式,如果遇到運算元(運算元若為多位,則需要累加合併在一塊,再入隊),則將運算元加入字尾表示式。
3、如果遇到操作符op,將操作符op與此時操作符棧s的棧頂的操作符,進行比較:
若op的優先順序高於棧頂操作符的優先順序,則壓入操作符棧s;
若op的優先順序小於或者等於棧頂操作符的優先順序,則將操作符棧從棧頂開始掃瞄,出棧加入字尾表示式,直到op的優先順序大於棧中的操作符的優先順序;
4、重複上述操作,若中綴表示式掃瞄結束,將操作符棧剩下的操作符依次出棧,按出棧順序加入至字尾表示式;
字尾表示式求值:
從左往右掃瞄字尾表示式,若是運算元,則入數棧;若是操作符,則從數棧中連續彈出兩個運算元,按照操作符,進行運算(後出棧的為第一運算元,先出棧的為第二運算元),將運算結果加入數棧。直至字尾表示式掃瞄完畢,數棧中此時只會存乙個數,改數即為結果。
ac**
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
/*測試資料
1 + 3 * 5 / 4 * 8 / 9 * 6 * 2 / 3 / 7 + 3 * 8 / 2
2 * 3 / 49
5 + 2 * 3 / 49 - 4 /13
*/struct node
;string str;
queueq;//字尾表示式佇列
stacks;//操作符棧
mapop;
void change()
t.num=dit;
t.flag=1;
q.push(t);
i--;
}else
s.push(t);}}
while(!s.empty())
}void cal()
else
}printf("%.2lf\n",s.top().num);
}int main()
while(!s.empty())
}return 0;
}
逆波蘭計算器 中綴表示式轉字尾表示式
1 2 3 4 5 2 這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有 1,2,3依次進棧,此時棧內依次為1 2 3 遇到 2 3出棧計算得到5,5再進棧,此時棧內依次為1 5 4進棧,此時棧內依次為1 5 4 遇到 4 5 出棧計算得...
中綴轉字尾表示式 字尾表達書計算
將中綴表示式轉換為字尾表示式 1 初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 2 從左至右掃瞄中綴表示式 3 遇到運算元時,將其壓入s2 4 遇到運算子時,比較其與s1棧頂運算子的優先順序 4 1 如果s1為空,或棧頂運算子為左括號 則直接將此運算子入棧 4 2 否則,若優先順序比棧頂運算子的...
中綴表示式轉字尾表示式之多項式計算器
要求 1.可以計算多位整數。比如2就是個位整數,234就是多位整數。2.滿足帶括號的要求 include define max 50 int level char p 規定運算子優先順序 return temp void cal int number int numbertop char symbo...