码迷,mamicode.com
首页 > 其他好文 > 详细

表达式求值

时间:2014-12-14 10:44:05      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:style   io   ar   color   os   使用   sp   for   on   

表达式求值

时间限制: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;
}












表达式求值

标签:style   io   ar   color   os   使用   sp   for   on   

原文地址:http://blog.csdn.net/qq_16997551/article/details/41923483

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!