hdu 1237 简单计算器(栈处理)
简单计算器
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26553 Accepted Submission(s): 9626
Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
用栈处理
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<stack> using namespace std; stack<double>num; int main() { double n; while(scanf("%lf", &n)) { char c,k; c = getchar(); if(c=='\n' && n==0) break; num.push(n); double m; while(1) { cin>>k; cin>>n; if(k == '*') { m = num.top(); m*=n; num.pop(); num.push(m); } else if(k == '/') { m = num.top(); m/=n; num.pop(); num.push(m); } else if(k == '+') { num.push(n); } else if(k == '-') { num.push(0-n); } if(getchar()=='\n') //本行输入完毕 break; } double sum = 0; while(!num.empty()) { sum+=num.top(); num.pop(); //使用完后栈一定要清空 } printf("%.2lf\n", sum); } return 0; }
一般方法模拟
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int main() { double a[1000]; double s, ss; char k, f; while (cin >> s)//题目要求多次输入 { int flag = 1, i = 0; memset(a, 0, sizeof(a)); a[0] = s; f = getchar(); if (s == 0 && f == '\n') { flag = 0; break; } while(1)//优先处理*、/运算 { cin >> k;//输入运算符 cin >> ss; if (k == '*') a[i] = a[i] * ss; if (k == '/') a[i] = a[i] / ss; if (k == '+') a[++i] = ss; if (k == '-') a[++i] = (-1)*ss; if (getchar() == '\n') break; } if (flag == 1) { double sum = 0; for (int j = 0; j <= i; j++) sum = sum + a[j]; printf("%.2lf\n", sum); } } return 0; }
等风起的那一天,我已准备好一切