采用栈的思想,对输入的字符串表达式进行求解。
#include<stdio.h>
double num[100];
int nt=0;
double oper[50];
int ot=0;
char opset[7]={'+','-','*','/','(',')','='};
unsigned char prior[7][7] = { // 算符间的优先关系
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ','='
};
char compare(char c1,char c2) //比较两个运算符c1,c2的优先级
{
int i1=0,i2=0;
while(opset[i1]!=c1&&i1<7)
{
i1++;
}
while(opset[i2]!=c2&&i2<7)
{
i2++;
}
return prior[i1][i2];
}
double cal(double n1,double n2,char c) //计算n1与n2的c运算
{
switch(c)
{
case'+': return n1+n2;
case'-': return n1-n2;
case'*':return n1*n2;
case'/':return n1/n2;
}
}
double Value()
{
char c;
int flag=1;
int isin=-1;
double time=10;
double temp=0;
oper[ot++]='=';
c=getchar();
while(ot>0) //循环读入字符并进行运算
{
isin=-1;
temp=0;
flag=1;
time=10;
while((c>='0'&&c<='9')||c=='.') //读入数字的情形
{
isin=1;
if(c=='.') //遇到小数点
{
flag=-1;
}
else
{
if(flag==1) //表示当前输入数字为小数点左面的数(整数位)
{
temp=temp*10+c-'0';
}
else //表示当前输入数字为小数点右面的数(小数位)
{
temp=temp+(c-'0')/time;
time=time*10;
}
}
c=getchar();
}
if(isin==1) //判断前面是否有数字输入
{
num[nt++]=temp;
}
switch(compare(oper[ot-1],c)) //比较运算符优先级
{
case'<': //前一运算符小于后面的优先级,把当前输入运算符压入栈中,继续读下一个字符
{
oper[ot++]=c;
c=getchar();
break;
}
case'=':
{ //遇到相匹配的括号或者'=',消去(即弹栈并放弃当前输入),并且读入下一个字符
--ot;
c=getchar();
break;
}
case'>': //前一个运算符优先级大于当前输入运算符,用前一个栈中运算符进行计算
{
num[nt-2]=cal(num[nt-2],num[nt-1],oper[ot-1]);
--nt;
--ot;
break;
}
}
}
return num[nt-1]; //处理完成,返回数字栈里面的最后值即为运算结果
}
int main()
{
printf("Input Expression:\n");
printf("%f",Value());
return 0;
}