NYOJ35——表达式求值

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35

这个是数据结构的经典题目。这里明确了只有+-*/以及小括号这几种符号。不会出现负数和除数为0;

题目的要求很少,如果扩大题目难度,去掉前面的要求,那么就应该考虑得更多,比如说:

1、除数为0;

2、会出现负数;

3、表达式不合格,比如出现其他的字符。

4、表达式中有任意多的空格。

当然,我在代码中已经指出什么情况该在哪里加条件。

AC代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int pri(char a)
{
	if(a == '(')
		return 5;
	if(a == '*' || a == '/')
		return 4;
	if(a == '+' || a == '-')
		return 3;
	if(a == ')')
		return 2;
	if(a == '=')
		return 1;
	return 0;
}

double cal(double a, double b, char c)
{
	if(c == '*')
		return a * b;
	if(c == '/')//这里需要判断除数是否为零,不过题目中给出保证,所以省略
		return a / b;
	if(c == '+')
		return a + b;
	if(c == '-')
		return a - b;
	return 0;
}

char stack[1000];
double NumStack[700];

double calculate(char *str)
{
	char num[15];
	int i = 0;
	int k;
	int top1 = -1;
	int top2 = -1;
	if(str[0] == '=')
		return 0.0;
	while((top1 >= 0 && top2 >= 1) || str[i] != '=')
	{
		k = -1;

		//如果数据有负数,这里可以加上负数的判断,这之前也可以加上略去空格的语句
		while((str[i] >= '0' && str[i] <= '9') || str[i] == '.')		
			num[++k]  = str[i++];

		if(k > -1)
		{
			num[++k] = '\0';
			NumStack[++top2] = atof(num);
		}
		//当前的str[i]一定是字符,如果中间出现空格,可以在这里考虑。滤去中间的空格。这里还可以加入符号判断。
		if(top1 >= 0)
		{
			if(str[i] == ')' && stack[top1] == '(')
			{
				--top1;
				++i;
				continue;
			}
			else if(stack[top1] != '(' && top2 >= 1 && pri(str[i]) <= pri(stack[top1]))
			{
				NumStack[top2 - 1] = cal(NumStack[top2 - 1], NumStack[top2], stack[top1]);
				--top1;
				--top2;
				continue;
			}
		}
		if(str[i] != '=')
		{
			stack[++top1] = str[i];
			++i;
		}
	}
	return NumStack[0];
}

int main()
{
	int t;
	char str[1005];
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		gets(str);
		printf("%.2f\n",calculate(str));
	}
	return 0;
}

你可能感兴趣的:(数据结构)