首页 > 编程知识 正文

数据结构表达式求值原理,设计算法求值用什么数据结构

时间:2023-05-05 07:40:38 阅读:22369 作者:2733

(数据结构)公式评价)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; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。