您的位置:首页 > 其它

02-3. 求前缀表达式的值(25)

2015-01-28 15:41 351 查看
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
char s[47];
stack<double>ss;

int is_op(char c)
{
if(c=='+' || c=='-' || c=='*' || c=='/')
return 1;
return 0;
}
int main()
{
while(gets(s))
{
while(!ss.empty())//清空
{
ss.pop();
}
int len = strlen(s);
int cc = 1;
double tsum = 0;
int flag = 0;//标记是否出现零作为除数的情况
for(int i = len-1; i >= 0; i--)
{
if(s[i]>='0' && s[i]<='9')
{
tsum+=(s[i]-'0')*cc;
cc*=10;
}
else if(s[i] == '.')//小数
{
tsum = tsum/(cc*1.0);
cc = 1;
}
else if((s[i]=='+'||s[i]=='-') && tsum!=0)
{
if(s[i] == '+')
{
ss.push(tsum);
i--;//跳过下一个空格
continue;
}
else
{
tsum = -tsum;
ss.push(tsum);
i--;//跳过下一个空格
continue;
}

}
else if(s[i] == ' ')//其中一个运算数已经统计完
{
ss.push(tsum);
tsum = 0;
cc = 1;
continue;
}
else if(is_op(s[i]))//如果是运算符
{
double a = ss.top();
ss.pop();
double b = ss.top();
ss.pop();
double tt = 0;
if(s[i] == '+')
tt = a+b;
else if(s[i] == '-')
tt = a-b;
else if(s[i] == '*')
tt = a*b;
else if(s[i] == '/')
{
if(b == 0)
{
flag = 1;
break;
}
tt = a/b;
}
ss.push(tt);
i--;//跳过下一个空格
}
}
/*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERROR
int lenn = ss.size();
double tt;
for(int i = 0; i < lenn; i++)
{
tt = ss.top();
ss.pop();
if(!is_op(tt))
{
k++;
}
}
if(flag != 1)
printf("%.1lf\n",tt);*/
if(flag != 1)
printf("%.1lf\n",ss.top());
else
printf("ERROR\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: