实现方法:对于一个已知的前缀式,从右向左读取,如果遇到操作数,处理并入栈,遇到操作符,则将栈顶两个元素分别出栈进行计算。(注意减法和除法时的先后顺序)
题目练习:nyoj128
#include
#include
#include
#include
#include
#include
using namespace std;
string prefix;
double num[200000];
double cal()
{
stack s;
while(!s.empty())
{
s.pop();
}
memset(num,0,sizeof(num));
double x,y;
int i = 0;
int k = 0;
while(i < prefix.length())
{
if(prefix[i] == ' ')
{
i++;
continue;
}
else if(prefix[i] == '+' || prefix[i] == '-' || prefix[i] == '*' || prefix[i] == '/')
{
if(prefix[i] == '+')
num[k] = -999999;
else if(prefix[i] == '-')
num[k] = -999998;
else if(prefix[i] == '*')
num[k] = -999997;
else if(prefix[i] == '/')
num[k] = -999996;
i++;
k++;
}
else
{
x = 0;
y = 0;
while(prefix[i] >= '0' && prefix[i] <= '9')
{
x *= 10;
x += prefix[i]-'0';
i++;
}
if(prefix[i] == '.')
{
double k = 10.00;
i++;
while(prefix[i] >= '0' && prefix[i] <= '9')
{
y += (prefix[i]-'0')/k;
k *= 10.00;
i++;
}
}
x += y;
num[k++] = x;
}
}
i = k-1;
for(i = k - 1; i >= 0; i--)
{
if(num[i] == -999999)
{
x = s.top();
s.pop();
x += s.top();
s.pop();
s.push(x);
}
else if(num[i] == -999998)
{
x = s.top();
s.pop();
x = x - s.top();
s.pop();
s.push(x);
}
else if(num[i] == -999997)
{
x = s.top();
s.pop();
x = s.top() * x;
s.pop();
s.push(x);
}
else if(num[i] == -999996)
{
x = s.top();
s.pop();
x = x / s.top();
s.pop();
s.push(x);
}
else
{
s.push(num[i]);
}
}
return s.top();
}
int main()
{
while(getline(cin,prefix))
{
printf("%.2f\n",cal());
}
}