NYOJ 35 表达式求值(栈)

表达式求值

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


<pre name="code" class="cpp"><span style="color:#009900;">//程序代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
#include<stack>
using namespace std;
stack<float> Ps;  //定义float型数据栈
stack<char> Cs;   //定义字符栈
char str[20];
char Prio[7] [7]=
{///*   +    -    *    /    (    )    =      //算术优先级表
/*+*/ {'>', '>', '<', '<', '<', '>', '>',}, 
/*-*/ {'>', '>', '<', '<', '<', '>', '>',}, 
/***/ {'>', '>', '>', '>', '<', '>', '>',}, 
/*/*/ {'>', '>', '>', '>', '<', '>', '>',},  
/*(*/ {'<', '<', '<', '<', '<', '=', '0',},  
/*)*/ {'>', '>', '>', '>', '0', '>', '>',},  
/*=*/ {'<', '<', '<', '<', '<', '0', '=',} 
 
};
int getNum(char c){
	switch(c){
		case '+':return 0;
		case '-':return 1;
		case '*':return 2;
		case '/':return 3;
		case '(':return 4;
		case ')':return 5;
		case '=':return 6; 
	}
}
bool isChar(char c){              //判断输入的字符是否为0~9或‘.’
	if(c>='0'&&c<='9'||c=='.')
	return true;
	return false;
}
float jisuan(float a,char str,float b){   //计算a*b
	switch(str){
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case '/':return a/b;
		
	}
}
int main(){
	int ncase;
	char c;
	char str[20];
	float a,b;
	int i=0;int flag=0;;
	scanf("%d",&ncase);
	while(ncase--){
		Cs.push('=');
		//printf("%d",Cs.empty());
		getchar();
		c=getchar();
		while(!(c == '=' && Cs.top() == '='))
		{
            //c=getchar();
            
			if(isChar(c)){
			    flag=1;
			    str[i++]=c;    //用字符数组str记录输入的数字字符,解决当
			    c=getchar();
			  
			}
			else{
				if(flag==1){           //flag用来判断是否向PS压入数据,解决当输入完毕时atof(str)为0时,
				str[i++]='\n';         //  可能出现的一直向PS栈压入0的情况
			       Ps.push(atof(str)); 
                                        //	printf("*****%.2f*****\n",atof(str)); 
				i=0;
				flag=0;
				}
			
				switch(Prio[getNum(Cs.top())][getNum(c)])   //获取CS栈顶字符与 当前输入字符c的优先级 
				{
					case '>':a=Ps.top();Ps.pop();
					         b=Ps.top();Ps.pop(); 
					         Ps.push(jisuan(b,Cs.top(),a));
					         Cs.pop();//printf("****%c****\n",Cs.top());
					         break;
				    case '=':Cs.pop();
				             c=getchar();
					         break;
				    case '<':Cs.push(c);
				             c=getchar();
				             break; 
				            
					 
				    default: break;
				}
				
				
			}
		//printf("****%c %d****\n",Cs.top(),Ps.top());
		}
		//Cs.pop();
		printf("%.2f\n",Ps.top());
		Ps.pop();       //清空PS栈 
	}
} 
</span>



Ps.push(atof(str));

你可能感兴趣的:(ACM,nyoj)