首页 > 代码库 > 表达式求值

表达式求值

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.50
4.00
代码:
#include<stdio.h>double fun(double a,double b,char ch){	if(ch==‘+‘)		return b+a;	if(ch==‘-‘)		return b-a;	if(ch==‘*‘)		return b*a;	if(ch==‘/‘)		return b/a;}int main(void){	int i,top1,top2;	int n;	double x,t,a,b;	double num[1000];	char str[1000],ch[1000];	scanf("%d",&n);	while(n--)	{		scanf("%s",str);		top1=-1;		top2=-1;			for(i=0;str[i]!=‘\0‘;i++)		{			x=0;			if(str[i]>=‘0‘&&str[i]<=‘9‘)			{				while(str[i]>=‘0‘&&str[i]<=‘9‘)				{					x=x*10+str[i]-‘0‘;					i++;				}				if(str[i]==‘.‘)				{					i++;					t=0.1;					while(str[i]>=‘0‘&&str[i]<=‘9‘)					{						x=x+(str[i]-‘0‘)*t;						t=t*0.1;						i++;					}				}				top1++;				num[top1]=x;			}		    if(str[i]==‘\0‘)				break;		    else if(str[i]==‘(‘)			{				ch[++top2]=str[i];			}			else if(str[i]==‘)‘)			{				while(top2>=0&&ch[top2]!=‘(‘)				{					a=num[top1];					top1--;					b=num[top1];					num[top1]=fun(a,b,ch[top2]);					top2--;				}				top2--;			}			else if(str[i]==‘*‘||str[i]==‘/‘)			{				while(ch[top2]==‘*‘||ch[top2]==‘/‘)				{					a=num[top1];					top1--;					b=num[top1];					num[top1]=fun(a,b,ch[top2]);					top2--;				}				ch[++top2]=str[i];			}			else 			{				while(top2>=0&&ch[top2]!=‘(‘)				{					a=num[top1];					top1--;					b=num[top1];					num[top1]=fun(a,b,ch[top2]);					top2--;				}				ch[++top2]=str[i];			}		}		while(top2>=0)		{			a=num[top1];			top1--;			b=num[top1];			num[top1]=fun(a,b,ch[top2]);			top2--;		}		printf("%.2f\n",num[0]);	}	return 0;}

表达式求值