题目链接:点击打开链接
题目大意:略。
解题思路:
1、前缀表达式的求值:
从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算,并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。
2、注意数字可能是 double 类型,遇到 “/”,考虑分母为 “0” 的情况。
AC 代码(支持 double 类型)
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
vector<string> v;
stack<double> sk;
int main()
{
v.clear();
while(!sk.empty()) sk.pop();
string s;
while(cin>>s) v.push_back(s);
int len=v.size(),flag=0;
stringstream ss;
double num,n1,n2;
for(int i=len-1;i>=0;i--)
{
s=v[i];
if(s!="+" && s!="-" && s!="*" && s!="/")
{
ss.clear(); ss<<s; ss>>num;
sk.push(num);
ss.str("");
}
else
{
n1=sk.top(); sk.pop(); n2=sk.top(); sk.pop();
if(s=="+")
sk.push(n1+n2);
else if(s=="-")
sk.push(n1-n2);
else if(s=="*")
sk.push(n1*n2);
else if(s=="/")
if(n2==0){ flag=1; break; }
else sk.push(n1/n2);
}
}
if(sk.size()!=1 || flag==1)
puts("ERROR");
else
printf("%.1f\n",sk.top());
return 0;
}