题目链接: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; }