#include <bits/stdc++.h>
using namespace std;
int error=0;//有错误信息就把它等于1
double sum=0;//储存每一布计算的值
stack<double>s;//创建栈
void calutate(double a,char c,double b){
sum=0;
if(c=='+') sum=a+b;
else if(c=='-') sum=a-b;
else if(c=='*') sum=a*b;
else if(c=='/') sum=1.0*a/b;
//我的错误:设置了全局变量sum 又设置局部变量sum 结果sum一直等于0
}
int main(){
string t;
getline(cin,t);//读入一行数据(+ + 2 * 3 - 7 4 / 8 4)
double x,a,b;char c;int point;//x保存数字的值 a,b运算数,c运算符,point处理有小数的
for(int i=t.length()-1;i>=0;i--){
//运算数 有整数,小数,负数,带正号的数 要区分
if(t[i]>='0'&t[i]<='9') {// -25.69 x=9 x=9+6*10 x=69/100 x=0.69+5 x=5.69+2*10
point=1;x=0;
for(;i>=0;i--){
if(t[i]>='0'&t[i]<='9') {//读入一个数字
x=x+(t[i]-'0')*point;
point*=10;
}
else if(t[i]=='.') {//处理小数点
x=1.0*x/point;
point=1;//注意把point重新置1
}
else if(t[i]=='-') x=-x;//处理负数
else if(t[i]=='+');//处理带正号的数
/*else if(t[i]==' ') {
s.push(x);
break;
} */ //只有一个数判断不了 +25.6或-5;
if(t[i]==' '||i==0) {
s.push(x);
break;
}
}
}
else if(t[i]=='+'||t[i]=='-'||t[i]=='*'||t[i]=='/'){
//遇到运算符
c=t[i];
if(s.size()<2) {
error=1;
break;
}//栈里没有两个元素做计算 就是错误信息
a=s.top();s.pop();//赋值,并出栈
b=s.top();s.pop();
if((b==0)&(c=='/')) {//被除数不能为零
error=1;
break;
}
calutate(a,c,b);//计算
s.push(sum);//压进栈
}
}
if(error==1) cout<<"ERROR\n";
else if(s.size()!=1) cout<<"ERROR\n";//栈只能有最后的结果
else printf("%.1f\n",s.top());
return 0;
}
7-1 求前缀表达式的值(有测试点)
最新推荐文章于 2024-10-05 12:07:50 发布