简单计算器
有中缀表达式与后缀表达式(逆波兰表达式)之间的转换,或者两个单独计算
对于一些题型,这个还没有考虑分母不为0,“(”与“)”与“…^”,等到完善了在来修改
例题
https://vjudge.net/contest/351438#problem/D
完整代码
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
#include <math.h>
float a[10000];
char b[10000],z[10000],h[10000];
int w1,w2;
int i=0, j=1;
void floatpush(float x)
{
a[++w1]=x;
}
void charpush(char x)
{
b[++w2]=x;
}
float floatpop()
{
w1--;
return a[w1+1];
}
char charpop()
{
w2--;
return b[w2+1];
}
void floatadd(float x)
{
a[w1]*=10;
a[w1]+=x;
}
int find()
{
char c;
c=charpop();
h[j]=' ';
h[j+1]=c;
j+=2;
if(w2==0)
return 0;
else
return 1;
}
int main()
{
while(gets(z)!=NULL)
{
w1=0,w2=0;
int les=strlen(z);
if(strcmp(z,"0")==0)
break;
else
{
for(i=0; i<les; i++)
{
if (z[i]>='0'&&z[i]<='9')
h[j++]=z[i];
else
{
if(z[i]=='+')
{
while(b[w2]=='+'||b[w2]=='-'||b[w2]=='*'||b[w2]=='/')
{
if(find()==0)
break;
}
charpush('+');
}
if(z[i]=='-')
{
while(b[w2]=='+'||b[w2]=='-'||b[w2]=='*'||b[w2]=='/')
{
if(find()==0)
break;
}
charpush('-');
}
if(z[i]=='*')
{
while(b[w2]=='*'||b[w2]=='/')
{
if(find()==0)
break;
}
charpush('*');
}
if(z[i]=='/')
{
while(b[w2]=='*'||b[w2]=='/')
{
if(find()==0)
break;
}
charpush('/');
}
h[j]=' ';
j++;
}
}
while(w2>0)
{
int c=charpop();
h[j]=' ';
h[j+1]=c;
j+=2;
}
h[j]='#';
i=1;
while(h[i]!='#')
{
if(h[i]=='+'||h[i]=='-'||h[i]=='*'||h[i]=='/')
{
float a=floatpop(),b=floatpop();
float c;
if(h[i]=='+')
c=a+b;
if(h[i]=='-')
c=b-a;
if(h[i]=='*')
c=a*b;
if(h[i]=='/')
c=(float)b/(float)a;
floatpush(c);
}
else
{
if(h[i]!=' ')
{
floatpush(h[i]-48);
j=1;
while(h[i+j]!=' ')
{
floatadd(h[i+j]-48);
j++;
}
i+=j-1;
}
}
i++;
}
printf("%.2f\n",a[1]);
}
}
return 0;
}