zoukankan      html  css  js  c++  java
  • 表达式求值

    表达式求值

    时间限制: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;
    }        
    
  • 相关阅读:
    30、Java中Set集合之HashSet、TreeSet和EnumSet
    此地址使用了一个通常用于网络浏览以外的端口。出于安全原因,Firefox 取消了该请求。
    C# 关闭显示器(显示)
    29、java中阻塞队列
    28、队列和栈
    27、ArrayList和LinkedList的区别
    26、线性表(List)
    WMI使用的WIN32_类库名
    android 怎样加速./mk snod打包
    hdu1081 最大子矩阵
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2224478.html
Copyright © 2011-2022 走看看