题目链接:点击打开链接
题目大意:略。
解题思路:
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; }