(数据结构)公式评价)1)背景:
我们的教材介绍了表达式评估的算法,但现在扩展了该算法的功能,以寻求能够处理(、-、*、/、% () ) )乘方)、)、)、)、)、)的运算符
要求:
在运算符优先算法中,计算的中间结果只保留整数。
输入:
第一行是整数n。 表示下面有n个表达式
从第2行开始后面的n行是由整数构成的n个公式
输出:
合计n行,与各行对应的公式的计算结果。
判断为公式有错误时,输出: error。
如果计算中除数为0,则输出: Divide 0。
特殊情况说明:
在表达式中,如果操作数具有负数(例如-8),请特别注意。 例如:
10加-8表示108。
10减8表示108。
测试案例1 :测试输入: 4
2^3
2^0
2^ 3 ^2
2^(3-1) ) (^(10-8 ) ) )。
期待输出: 8
1
512
16
测试案例2 :测试输入: 11
(2) 8
2 )8) )。
8/0
8/(85-13 ) )。
2^(2-5) )。
10--(80-30 )/33 ) 4
10-80-30(/33 ) 4
(2)8)3)2)。
(2)3)8)。
30(/3 ) 4
10(20-8 ) 2
期待输出。
错误.
Divide 0..
Divide 0..
错误.
错误.
错误.
错误.
错误.
错误.
错误.
测试案例3 :测试输入: 2
十(十)。
14*10-(10 ) 2
期待输出。
错误.
测试案例4 :测试输入: 14
18-32
18/4
18%3
10 204
10-20/4
(18-3 ) 3
十(十)。
(10 2)/(8-10 ) )。
(23 )/(52 ) )。
10--(80-30 )/33 ) 4
()2)8)2-(2)4)/2 )2-8) 2
() (8) (4之二) )
10/0
(10-802 )
期待输出:-14
4
0
90
5
45
100
-6
0
-34
52
20
Divide 0..
错误.
代码如下。 # include stdio.h # include string.h # include math.h # definemax 1000000 int fig [ 100 ]; char sym[100]; int temp1=-1,temp2=-1; char op[9]={ ' '、'-'、' * '、'/'、'() )、()、)、(# )、(^ )、(% ) }; char checklist[9][9]={ { ' ',',',',',',',',',',',',',',',',' “,1,”,“,”,“,”,“=”,“,,” }voidpush_figure(intq ) { fig[ temp1]=q; } int pop_figure () { return f
ig[temp1--]; } char pop_symbol() { return sym[temp2--]; } void push_symbol(char ch) { sym[++temp2]=ch; } int operate(int x, int y, char symbol) { switch (symbol) { case '+': return x+y; case '-': return x-y; case '*': return x*y; case '/': if(y) return x / y; else { printf("Divide 0.n"); return MAX; } case '%': return (int)fmod(x,y); case '^': if (y >= 0) return (int)pow(x,y); else { printf("error.n"); return MAX; } default: printf("error.n"); return MAX; } } char compare(char x,char y) { int a, b; for(int i = 0; i <= 8; i++) { if(op[i] == x) { a = i; break; } } for(int i = 0; i <= 8; i++) { if(op[i] == y) { b = i; break; } } return checklist[a][b]; } int main() { int n,flag = 0; char expression[100], * p; scanf("%d", &n); while(n--) { flag = 2; scanf("%s", expression); strcat(expression,"#"); p = expression; push_symbol('#'); k:while(*p != '#' || sym[temp2] != '#') { if(*p >= '0' && *p <= '9') { if(flag == 0) { push_figure(pop_figure() * 10 + number(p++)); flag = 0; } else push_figure(number(p++)); flag = 0; } else { if(flag == 1) { if(*p == '+' || *p == '-' || *p == '*' || *p == '/' || *p == '%' || *p == '^') { printf("error.n"); goto j; } } if(*p == '(') flag = 1; else flag = 2; if (temp2 == -1) { printf("error.n"); goto j; } else { char ch = pop_symbol(), ans; ans = compare(ch, *p); if(ans == ' ') { printf("error.n"); goto j; } else if(ans == '<') { push_symbol(ch); push_symbol(*p++); goto k; } else if(ans == '=') { p++; goto k; } else { int integer_x, integer_y; integer_y = pop_figure(); integer_x = pop_figure(); int judge = operate(integer_x, integer_y, ch); if (judge == MAX) goto j; else push_figure(judge); continue; } p++; } } } if(temp1 == 0 && temp2 == 0) printf("%dn", fig[temp1]); else { printf("error.n"); } j: memset(expression,' ',100); temp1 = -1; temp2 = -1; } return 0; }