输入样例
+ + 2 * 3 - 7 4 / 8 4
输出样例
13.0
思路: 这题根据前缀表达式求值,可以根据要求,先将数字入栈,然后遇到符号就将栈顶的两个元素弹出,并计算答案,然后将结果入栈,最终的栈顶元素就是答案。
但是!!!!!
这题有几个点:
1、可以输入负数。
2、可以输入小数。
3、可以输入多位数。
4、不能忘了 ERROR,也就是除数为0.
5、估计最后一组数据只有一个数字,最前面是一个数字,要注意计数注意不能索引小于0,否则会段错误。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <cmath>
using namespace std;
char str[200005];
stack<double>s;
int main()
{
//ios::sync_with_stdio(0);
//cin.tie(0); cout.tie(0);
char temp;
int k = 0;
while ((temp = getchar()) != '\n')
{
if (temp == ' ')
temp = '#';
str[k++] = temp;
}
str[k] = '\0';
int cnt = 0;
for (int i = k - 1; i >= 0; --i)
{
if (str[i] == '#') continue;
if (str[i] >= '0' && str[i] <= '9')
{
double num = str[i] - '0', mul = 10;
i--;
for (;i >= 0; --i)
{
if (str[i] >= '0' && str[i] <= '9')
{
num += (str[i] - '0') * mul;
mul *= 10;
}
else if (str[i] == '.')
{
num /= mul;
mul = 1;
}
else if (str[i] == '-')
{
num = -num;
}
else
break;
}
s.push(num);
}
else
{
double l = s.top(); s.pop();
double r = s.top(); s.pop();
double res;
if (str[i] == '+') res = l + r;
if (str[i] == '-') res = l - r;
if (str[i] == '*') res = l * r;
if (str[i] == '/')
{
if (r == 0)
{
printf("ERROR\n");
return 0;
}
res = l * 1.0 / r;
}
s.push(res);
}
}
printf("%.1lf\n", s.top());
return 0;
}