簡單計算器 中綴表示式轉字尾表示式 求值

2021-10-22 06:04:42 字數 1892 閱讀 2054

[命題人 : 外部匯入]

時間限制 : 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...