表达式求值

表达式求值

时间限制: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 <stack>
#include <string>
#include <math.h>
#include <stdio.h>
#include <iostream>
using namespace std;
string str;
double shu[510],mn;
char fh[1002];
int last,lst;
double st_doub(int &i)
{
	int k=0;
	double num=0;
	for(;;i++)
	{
		if(str[i]>='0'&&str[i]<='9')
			num=num*10+(str[i]-'0');
		else
			if(str[i]=='.')
				k=i;
			else
				break;
	}
	if(k!=0)
		num/=pow(10,i-k-1);
	return num;
}
double cal(int l,int r)
{
	char ffh[510];
	int i,fl=0,ss=lst;
	double ans,fshu[510];	
	i=l+1;
	fshu[fl]=shu[ss++];	
	while(i<r)
	{	
		ffh[fl++]=fh[i++];
		fshu[fl]=shu[ss++];
		if(ffh[fl-1]=='*')
		{
			ans=fshu[fl]*fshu[fl-1];
			fl--;
			fshu[fl]=ans;
		}
		if(ffh[fl-1]=='/')
		{
			ans=fshu[fl-1]/fshu[fl];
			fl--;
			fshu[fl]=ans;
		}
	}
	ans=fshu[0];
	for(i=0;i<fl;i++)
	{
		if(ffh[i]=='+')
			ans+=fshu[i+1];
		if(ffh[i]=='-')
			ans-=fshu[i+1];
	}
	return ans;
}

double calcu()
{	
	int i,n,l,r;
	cin>>str;
	n=str.length();
	str[n-1]=')';
	lst=0;r=0;i=0;
	while(i<n)
	{
		for(;fh[r-1]!=')'&&i<n;i++)
		{		
			if(str[i]>='0'&&str[i]<='9')
				shu[lst++]=st_doub(i);
			fh[r++]=str[i];
		}
		l=r-2;
		int cont=0;
		while(fh[l]!='('&&l>=0)
		{
			
			if(fh[l]=='*'||fh[l]=='/'||fh[l]=='-'||fh[l]=='+')
				cont++;l--;
		}
		lst=lst-cont-1;
		shu[lst++]=cal(l,r-1);
		r=l;
	}
	return shu[0];
}

int main()
{
	int n,i,k,mx,l,r,j,l1,r1;
	bool flg;	
	double num1,num2;
	scanf("%d",&mx);
	while(mx--)
	{
		printf("%.2lf\n",calcu());
	}
	return 0;
}        
原文地址:https://www.cnblogs.com/qijinbiao/p/2224478.html