c语言编写四则运算.docx
《c语言编写四则运算.docx》由会员分享,可在线阅读,更多相关《c语言编写四则运算.docx(10页珍藏版)》请在冰豆网上搜索。
c语言编写四则运算
C语言编写四那么运算
#include//计算器
#include
#defineSTACK_SIZE100//maxsizeofthestack
#defineSTACK_INCREMENT10//reallocsize
typedefstructFStack//stackofint
{
float*base;
float*top;
intstacksize;
}FStack;
voidInit(FStack*s)
{
s->base=(float*)malloc(STACK_SIZE*sizeof(FStack));
if(!
s->base)
{
printf("overflow!
\n");
return;
}
s->top=s->base;
s->stacksize=STACK_SIZE;
}
boolisEmpty(FStack*s)
{
if(s->top==s->base)
{
returntrue;
}
else
{
returnfalse;
}
}
voidPush(FStack*s,floate)
{
if(s->top-s->base>=s->stacksize)
{
printf("stackisfull!
\nrealloc%d\n",STACK_INCREMENT);
s->base=(float*)realloc(s->base,(s->stacksize+sizeof(FStack)));
if(!
s->base)
{
printf("overflow!
\n");
return;
}
s->top=s->base+s->stacksize;
s->stacksize+=STACK_INCREMENT;
}
*(s->top)=e;
(s->top)++;
}
floatGetTop(FStack*s)
{
if(s->top==s->base)
{
printf("stackisempty!
\n");
return0;
}
floate=*(s->top-1);
returne;
}
voidPop(FStack*s)
{
if(s->top==s->base)
{
printf("stackisempty!
\n");
return;
}
s->top--;
}
typedefstructCStack//stackofchar
{
char*base;
char*top;
intstacksize;
}CStack;
voidInit(CStack*s)
{
s->base=(char*)malloc(STACK_SIZE*sizeof(CStack));
if(!
s->base)
{
printf("overflow!
\n");
return;
}
s->top=s->base;
s->stacksize=STACK_SIZE;
}
boolisEmpty(CStack*s)
{
if(s->top==s->base)
{
returntrue;
}
else
{
returnfalse;
}
}
voidPush(CStack*s,inte)
{
if(s->top-s->base>=s->stacksize)
{
printf("stackisfull!
\nrealloc%d\n",STACK_INCREMENT);
s->base=(char*)realloc(s->base,(s->stacksize+sizeof(CStack)));
if(!
s->base)
{
printf("overflow!
\n");
return;
}
s->top=s->base+s->stacksize;
s->stacksize+=STACK_INCREMENT;
}
*(s->top)=e;
(s->top)++;
}
charGetTop(CStack*s)
{
if(s->top==s->base)
{
printf("stackisempty!
\n");
return0;
}
chare=*(s->top-1);
returne;
}
voidPop(CStack*s)
{
if(s->top==s->base)
{
printf("stackisempty!
\n");
return;
}
s->top--;
}
boolisOper(charch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='%')
{
returntrue;
}
else
{
returnfalse;
}
}
intPriority(charch)
{
intp;
switch(ch)
{
case'(':
p=0;
break;
case'+':
case'-':
p=1;
break;
case'*':
case'/':
case'%':
p=2;
break;
}
returnp;
}
floatCalculate(floatf1,floatf2,charoper)
{
floatf3;
switch(oper)
{
case'+':
f3=f1+f2;
break;
case'-':
f3=f1-f2;
break;
case'*':
f3=f1*f2;
break;
case'%':
f3=(float)((int)f1%(int)f2);
break;
case'/':
if(f2==0)
{
printf("\nDevidedbyzero!
");
exit
(1);
}
else
{
f3=f1/f2;
}
break;
}
returnf3;
}
floatStrtoFloat(char*str,int*pos)
{
floatfRes;
inti=*pos;
intk;
charn[50];
for(k=0;str[i]>='0'&&str[i]<='9'||str[i]=='.';i++,k++)
{
n[k]=str[i];
}
n[k]='\0';
*pos=i;
fRes=atof(n);
returnfRes;
}
boolCheck(char*str)
{
inti=0;
while(str[i]!
='\0')
{
if(str[i]!
='+'&&str[i]!
='-'&&str[i]!
='*'&&str[i]!
='/'&&str[i]!
='%'&&str[i]!
='.'&&str[i]!
='('&&str[i]!
=')'&&(str[i]<'0'||str[i]>'9'))
{
returnfalse;
}
i++;
}
returntrue;
}
voidmain()
{
charexp[100];
inti;
floatf,f1,f2;
charoper;
FStackfstack;
CStackcstack;
Init(&fstack);
Init(&cstack);
printf("Theexpressionis:
");
gets(exp);
if(!
Check(exp))
{
printf("inputerror!
exitnow!
\n");
exit
(1);
}
for(i=0;exp[i]!
='\0'&&exp[i]!
=-52;i++)
{
if(!
isOper(exp[i]))
{
f=StrtoFloat(exp,&i);
Push(&fstack,f);
}
if(isOper(exp[i]))
{
if(!
isEmpty(&cstack))
{
while(!
isEmpty(&cstack)&&Priority(exp[i])<=Priority(GetTop(&cstack)))
{
oper=GetTop(&cstack);
Pop(&cstack);
f2=GetTop(&fstack);
Pop(&fstack);
f1=GetTop(&fstack);
Pop(&fstack);
f=Calculate(f1,f2,oper);
Push(&fstack,f);
}
Push(&cstack,exp[i]);
}
else
{
Push(&cstack,exp[i]);
}
}
elseif(exp[i]=='(')
{
Push(&cstack,exp[i]);
}
elseif(exp[i]==')')
{
while(GetTop(&cstack)!
='('&&!
isEmpty(&cstack))
{
oper=GetTop(&cstack);
Pop(&cstack);
f2=GetTop(&fstack);
Pop(&fstack);
f1=GetTop(&fstack);
Pop(&fstack);
f=Calculate(f1,f2,oper);
Push(&fstack,f);
}
Pop(&cstack);
}
}
while(!
isEmpty(&cstack))
{
oper=GetTop(&cstack);
Pop(&cstack);
f2=GetTop(&fstack);
Pop(&fstack);
f1=GetTop(&fstack);
Pop(&fstack);
f=Calculate(f1,f2,oper);
Push(&fstack,f);
}
printf("\nTheresultis:
%f\n",GetTop(&fstack));
Pop(&fstack);
}