#include<stdio.h>
#include<stack>
#include<stdlib.h>
using namespace std;
stack<int> op;
stack<double> nu;
char str[220];
int mat[][5] = //定义优先级关系
{
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,1,1,0,0,
1,1,1,0,0
};
void getOp(int &reto, int &retn, int &i)
{
char num[100];
int idx;
if(i==0 && op.empty()) //考虑起始符和终止符
{
reto = 1;
retn = 0;
return;
}
if(str[i] == '\0') //考虑起始符和终止符
{
reto = 1;
retn = 0;
return;
}
while(str[i] == ' ')
i++;
if(str[i] >= '0' && str[i] <= '9')
{
idx = 0;
while(str[i] >= '0' && str[i] <= '9')
{
num[idx++] = str[i++];
}
num[idx] = '\0';
retn = atoi(num);
reto = 0;
return;
}
else
{
reto = 1;
if(str[i] == '+')
retn = 1;
else if(str[i] == '-')
retn = 2;
else if(str[i] == '*')
retn = 3;
else if(str[i] == '/')
retn = 4;
i++;
return;
}
}
int main()
{
double tmp,a,b;
int retn,reto,i,opera;
while(gets(str))
{
if(str[0] == '0' && str[1] == '\0')
break;
while(!op.empty()) //初始化
op.pop();
while(!nu.empty())
nu.pop();
i = 0;
while(true)
{
getOp(reto, retn, i);
if(reto == 0)
nu.push((double)retn);
else
{
if(op.empty() || mat[retn][op.top()] == 1)
op.push(retn);
else
{
while(mat[retn][op.top()] == 0)
{
opera = op.top();
op.pop(); //注意a,b的顺序
b = nu.top();
nu.pop();
a = nu.top();
nu.pop();
if(opera == 1)
tmp = a+b;
else if(opera == 2)
tmp = a-b;
else if(opera == 3)
tmp = a*b;
else if(opera == 4)
tmp = a/b;
nu.push(tmp);
}
op.push(retn);
}
}
if(op.size() == 2 && op.top() == 0) //退出条件
break;
}
printf("%.2lf\n", nu.top());
}
return 0;
}
九度oj-1019:简单计算器
最新推荐文章于 2019-06-08 12:28:42 发布