表达式求值

表达式求值

描述
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

AC代码:
#include<cstdio>
#include<cctype>
#include<stack>
#include<cstring>
#include<cstdlib>

using namespace std;

void Calculate(stack<double>& opnd,stack<char>& optr)
{
	double result,a,b;
	b=opnd.top();
	opnd.pop();
	a=opnd.top();
	opnd.pop();
	char op=optr.top();
	optr.pop();
	switch(op)
	{
		case '+':
			result=a+b;
			break;
		case '-':
			result=a-b;
			break;
		case '*':
			result=a*b;
			break;
		case '/':
			result=a/b;
			break;
	}
	opnd.push(result);
}

int PriThan(char a,stack<char>& optr)
{
	if(a=='(')
		return 0;
	if(optr.top()=='(')
		return 1;
	if(a=='+'||a=='-')
		return 0;
	if(optr.top()=='*'||optr.top()=='/')
		return 0;
	return 1;
}

int main(int argc,char *argv[])
{
	stack<double> opnd;
	stack<char> optr;
	int i,n,len;
	char str[1005];
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		scanf("%s",str);
		len=strlen(str);
		for(i=0;i<len;i++)
		{
			if(isdigit(str[i]))
			{
				double num=atof(&str[i]);
				while(i<len&&(isdigit(str[i])||str[i]=='.'))
					i++;
				i--;
				opnd.push(num);
			}
			else if(str[i]=='(')
				optr.push(str[i]);
			else if(str[i]==')')
			{
				while(optr.top()!='(')
					Calculate(opnd,optr);
				optr.pop();//弹出‘(’
			}
			else
			{
				while(!optr.empty())
				{
					if(!PriThan(str[i],optr))//栈顶运算符的优先级高于
				    {                   //字符c,那么对栈顶运算符进行计算
					   Calculate(opnd,optr);
					}
					else
						break;
				}
				optr.push(str[i]);
			}
		}
		optr.pop();
		while(!optr.empty())
			Calculate(opnd,optr);
		printf("%.2f\n",opnd.top());
		opnd.pop();
	}

	return 0;
}



你可能感兴趣的:(数据结构,C++,算法,STL,表达式求值)