HDU 1237 简单计算器(栈)
Description:
读入一个只包含 +,-,*,/的非负整数计算表达式,计算该表达式的值。
Input:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input:
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output:
3.00
13.36
题目链接
这道题最开始想的是用处理字符串,但是处理起来会非常麻烦,用栈会好些很多,首先读入第一个数压入栈顶,之后每次读入一个符号和一个数字,如果是"+“号则将数字压入栈顶,如果是”-“号则将数字的相反数压入栈顶,如果是”*“号则先将数字与栈顶数字相乘再将栈顶元素取出,向栈顶压入计算所得数字,如果是”/"号则先将栈顶数字与数字相除再将栈顶元素取出,向栈顶压入计算所得数字。所有数据读入完成之后栈内所有元素之和便是结果。
AC代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
double ans,a,b,n;
char c;
while (1) {
stack<double> S;
ans = 0;
cin >> n;
c = getchar();
if (n == 0 && c == '\n') {
break;
}
S.push(n);
while (cin >> c >> n) {
if (c == '+') {
S.push(n);
}
else if (c == '-') {
S.push(-n);
}
else if (c == '*') {
n = S.top() * n;
S.pop();
S.push(n);
}
else if (c == '/') {
n = S.top() / n;
S.pop();
S.push(n);
}
if (getchar() == '\n') {
break;
}
}
while (!S.empty()) {
ans += S.top();
S.pop();
}
cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl;
}
return 0;
}