題目描述
讀入乙個只包含 +, -, *, / 的非負整數計算表示式,計算該表示式的值。
輸入
測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。
輸出
對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。
樣例輸入
30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 92
0
樣例輸出
12178.21
思路
中綴表示式不利於計算(只能從後往前算,是錯的),所以要先轉化成字尾表示式,再計算。
轉為字尾表示式:
若是運算元,則入字尾表示式佇列;
若是操作符。若小於或等於操作符棧頂操作符優先順序,則不斷出棧,併入字尾表示式佇列,然後該操作符入操作符棧;若大於,則直接入佇列。(需提前用map 為操作符設定優先順序)
計算字尾表示式佇列不斷出佇列:
若是運算元,入運算元棧;
若是運算子,要從運算元棧中彈出兩個數,注意,第二個彈出的數才是被運算元。
直至隊列為空,此時運算元棧的棧頂元素就是計算結果。
後來提交一直答案錯誤的原因是:在string轉化為double 時,ans的值未初始化為0。導致輸入 0 - 0 時,輸出的是-0.00。
ac**
#include
#include
#include
#include
#include
#include
using namespace std;
struct node
;stack st;
queue que;
stack<
double
> out;
string s;
map<
char
,int
> opr;
double
todouble
(string s)
temp=1;
for(
int i=dot;ilength()
;i++
)return ans;
}void
change()
else
//若是運算子
st.push
(temp)
; i++;}
}while
(!st.
empty()
)//注意要把操作符棧中的剩餘操作符入佇列
}double
cal(
) que.
pop();
}}intmain()
while
(!st.
empty()
) st.
pop();
//初始化存放操作符的棧
while
(!out.
empty()
) out.
pop();
//初始化計算時存放運算元的棧
change()
;//把中綴表示式轉化為字尾表示式
cal();
//計算
printf
("%.2f\n"
,out.
top())
;}}
codeup1918簡單計算器
讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。30 90 26 9...
codeup 1918 簡單計算器
問題 a 簡單計算器 時間限制 1 sec 記憶體限制 32 mb 提交 2132 解決 877 提交 狀態 討論版 命題人 外部匯入 題目描述 讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。輸入測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空...
codeup 1918 簡單計算器
codeup 1918 include include include include include include using namespace std struct node string srt stack s 操作符棧 queue q 字尾表示式序列 map char int op vo...