NYOJ 35

简介:   表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。

 

表达式求值

时间限制: 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<iostream>
#include<cstdio>//sscanf
#include<string>
#include<cstring>
#include<stack>
using namespace std;
char ch[7][7]=
{ 
    {'>','>','<','<','<','>','>'},
    {'>','>','<','<','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'>','>','>','>','<','>','>'},
    {'<','<','<','<','<','=',' '},
    {' ',' ',' ',' ',' ',' ',' '},
    {'<','<','<','<','<',' ','='},
};
int sign(char ch)
{
	switch(ch)
	{
		case '+' : return 0;
		case '-'  : return 1;
		case '*'  : return 2;
		case '/'  : return 3;
		case '('  : return 4;
		case ')'  : return 5;
		case '=' : return 6;
		//default : exit(-1);
	}
}
char pri(char a, char b)
{
    return ch[sign(a)][sign(b)];
}
double calc(double a, char oper, double b)
{
	switch(oper)
	{
		case '+' : return a + b;
		case '-' : return a - b;
		case '*' : return a * b;
		case '/' : return a / b;
		//default : exit(-1);
	}
}
int main()
{
	int i,j,k,T;
	cin>>T;
	while(T--)
	{
        string str;
        str.clear();
    	stack <double > num;
    	stack <char> oper;
		cin>>str;
		oper.push('=');
		int d = 0;
		double temp;
		for(i=0;i<str.length();i++)
		{
            /*
            下面是我的中缀式转后缀式时对浮点数的做法 
            if(isdigit(str[i]))
            {
                j=i+1;
                while(isdigit(str[j])||str[j]=='.')
                    j++;
                for(k=i;k<=j-1;k++)
                    printf("%c",str[k]);
                putchar(' ');
                i=j-1;//不是 i=j,因为i还要自增 
            }
            */                
			if(isdigit(str[i])||str[i]=='.')
			{
				sscanf(&str[i],"%lf%n",&temp,&d);
				num.push(temp);
				i=i+d-1;
			}
			else if(!isdigit(str[i])&&str[i]!='.')
			{
				double a, b;
				char ope;
				switch(pri(oper.top(),str[i]))
				{
    				case '<' : oper.push(str[i]); break;
    				case '=' : oper.pop(); break;//左括号遇到有括号 
    				case '>' : //操作符栈里不存在括号 
    					ope = oper.top(); oper.pop();
    					b = num.top(); num.pop();//注意a,b的顺序 
    					a = num.top(); num.pop();
    					num.push(calc(a, ope, b));
    				    i--;break;//别忘了i-- 
    				default : break;
				}
			}
		}
		printf("%.2lf\n", num.top());
		while(!num.empty())
		  num.pop();
		while(!oper.empty())
		  oper.pop();
		
	}
	return 0;
}        

 

目录
相关文章
|
7月前
|
算法
NYOJ-448-寻找最大数
NYOJ-448-寻找最大数
31 0
|
人工智能 算法
|
测试技术
NYOJ 541
  最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
773 0
|
JavaScript
NYOJ&#160;17
时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0 随后的n行,每行有一个字符串,该字符串的长度不会超过10000 输出 输出字符串的最长递增子序列的长度 样例输入 3 aaa ababc abklmncdefg 样例输出 1 3 7 题目很经典,学习一下吧。
672 0
NYOJ 93
  汉诺塔(三) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
601 0
|
测试技术
NYOJ 523
  亡命逃窜 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述   从前有个叫hck的骑士,为了救我们美丽的公主,潜入魔王的老巢,够英雄吧。不过英雄不是这么好当的。
916 0
NYOJ 113
1 #include 2 #include 3 using namespace std; 4 5 int main() 6 { 7 int pos=-1; 8 string s; 9 while(getline(cin,s)) 10 { 11 while((pos=s.
682 0
NYOJ 86
  找球号(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3   描述 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0
811 0
|
人工智能
NYOJ 461
  Fibonacci数列(四) 时间限制:1000 ms | 内存限制:65535 KB 难度:4   描述 数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
724 0