Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 7093????Accepted Submission(s): 2283
?
Output 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。?
Sample Input1 + 2 4 + 2 * 5 - 7 / 11 0
?
Sample Output3.00 13.36
????????? 题目大意:输入一堆运算,模拟计算器计算,写成计算结果。考你基本功,我是用stack来判断优先级,写得很长不是很好,有个地方写错,WA几次,所以说,基本功要搞好,水题啊!一定要小心。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237
代码:
#include <iostream> #include <stdio.h> #include <memory.h> #include <cstring> #include <string> #include <stack> using namespace std; double a[505]; char ch[505]; int main() { int i, len; double ch1, ch2, temp, tt; char cc, op, opt; bool tar; while(scanf("%lf", &a[0])) { tar = false; i = 1; while(1) { cc = getchar(); if(cc == ' ') continue; if(cc == '\n') break; tar = true; ch[i] = cc; scanf("%lf", &a[i]); i++; } if(tar == false) { if(a[0] == 0.0) return 0; printf("%.2lf\n", a[0]); continue; } len = i; stack<double> st; stack<char> sc; st.push(a[0]); sc.push(ch[1]); st.push(a[1]); i = 2; for(i = 2; ; i++) { if(i >= len && st.size() <=2) break; ch2 = st.top(); op = sc.top(); if(op == '*') { st.pop(); sc.pop(); ch1 = st.top(); st.pop(); temp = ch1 * ch2; st.push(temp); if(i < len) { sc.push(ch[i]); st.push(a[i]); } } else if(op == '/') { st.pop(); sc.pop(); ch1 = st.top(); st.pop(); temp = ch1 / ch2; st.push(temp); if(i < len) { sc.push(ch[i]); st.push(a[i]); } } else if(op == '+' && st.size() >= 3) { tt = ch2; st.pop(); ch2 = st.top(); st.pop(); opt = op; sc.pop(); op = sc.top(); sc.pop(); ch1 = st.top(); st.pop(); if(op == '+') temp = ch1 + ch2; if(op == '-') temp = ch1 - ch2; st.push(temp); sc.push(opt); st.push(tt); if(i < len) { sc.push(ch[i]); st.push(a[i]); } //printf("---%.0lf %c %.0lf---\n", temp, opt, tt); } else if(op == '-' && st.size() >= 3) { tt = ch2; st.pop(); ch2 = st.top(); st.pop(); opt = op; sc.pop(); op = sc.top(); sc.pop(); ch1 = st.top(); st.pop(); if(op == '+') temp = ch1 + ch2; if(op == '-') temp = ch1 - ch2; st.push(temp); sc.push(opt); st.push(tt); if(i < len) { sc.push(ch[i]); st.push(a[i]); } //printf("---%.0lf %c %.0lf---\n", temp, opt, tt); } else { st.push(a[i]); sc.push(ch[i]); } //printf("%d: %.1lf %.1lf %.1lf\n", i, ch1, ch2, temp); } ch2 = st.top(); st.pop(); op = sc.top(); sc.pop(); ch1 = st.top(); st.pop(); //printf("%.0lf %c %.0lf\n", ch1, op, ch2); if(op == '+') temp = ch1 + ch2; if(op == '-') temp = ch1 - ch2; if(op == '*') temp = ch1 * ch2; if(op == '/') temp = ch1 / ch2; //printf("result = %.2lf\n", temp); printf("%.2lf\n", temp); memset(a, 0, sizeof(a)); memset(ch, 0, sizeof(ch)); } return 0; }
?