要求:
优化表达式求值算法,使得该算法可实现多位整数甚至浮点数的四则运算,并写程序进行验证
一下代码由AI生成,这个作业我是实在不想做了,老师上课讲的时候也是一笔带过,然后就要求我们自己动手写......
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double *base;
double *top;
int stacksize;
} SqStackOPND;
typedef struct {
char *base;
char *top;
int stacksize;
} SqStackOPTR;
void initStackOPND(SqStackOPND *S) {
S->base = (double *) malloc(100 * sizeof(double));
S->top = S->base;
S->stacksize = 100;
}
void initStackOPTR(SqStackOPTR *S) {
S->base = (char *) malloc(100 * sizeof(char));
S->top = S->base;
S->stacksize = 100;
}
void pushOPND(SqStackOPND *S, double e) {
if (S->top - S->base == S->stacksize) {
S->base = (double *) realloc(S->base, (S->stacksize + 10) * sizeof(double));
S->top = S->base + S->stacksize;
S->stacksize += 10;
}
*(S->top) = e;
(S->top)++;
}
void pushOPTR(SqStackOPTR *S, char e) {
if (S->top - S->base == S->stacksize) {
S->base = (char *) realloc(S->base, (S->stacksize + 10) * sizeof(char));
S->top = S->base + S->stacksize;
S->stacksize += 10;
}
*(S->top) = e;
(S->top)++;
}
double popOPND(SqStackOPND *S) {
(S->top)--;
return *(S->top);
}
char popOPTR(SqStackOPTR *S) {
(S->top)--;
return *(S->top);
}
double getTopOPND(SqStackOPND S) {
double e = *(S.top - 1);
return e;
}
char getTopOPTR(SqStackOPTR S) {
char e = *(S.top - 1);
return e;
}
double calculate(double a, char theta, double b) {
switch (theta) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
exit(-1);
}
}
char precedence(char Aop, char Bop) {
if ((Aop == '+' || Aop == '-') && (Bop == '+' || Bop == '-' || Bop == ')' || Bop == '#')) {
return '>';
} else if ((Aop == '+' || Aop == '-') && (Bop == '*' || Bop == '/' || Bop == '(')) {
return '<';
} else if ((Aop == '*' || Aop == '/') && (Bop == '+' || Bop == '-' || Bop == '*' || Bop == '/' || Bop == ')' || Bop == '#')) {
return '>';
} else if ((Aop == '*' || Aop == '/') && (Bop == '(')) {
return '<';
} else if (Aop == '(' && (Bop == '+' || Bop == '-' || Bop == '*' || Bop == '/' || Bop == '(')) {
return '<';
} else if (Aop == '(' && Bop == ')') {
return '=';
} else if ((Aop == '+' || Aop == '-' || Aop == '*' || Aop == '/' || Aop == ')') && Bop == '(') {
return '<';
} else if (Aop == '#' && Bop == '#') {
return '=';
} else {
return '<';
}
}
//测试(2.8+2.2)*(1.4+1.6)/5.0=3
int main() {
SqStackOPND OPND;
SqStackOPTR OPTR;
double a, b, d;
char c, theta;
initStackOPND(&OPND);
initStackOPTR(&OPTR);
pushOPTR(&OPTR, '#');
printf("Enter expression ended with '#':");
scanf("%c", &c);
// 读取多位数
while (c != '#' || getTopOPTR(OPTR) != '#') {
if ((c >= '0' && c <= '9') || c == '.') {
ungetc(c, stdin);
scanf("%lf", &d);
pushOPND(&OPND, d);
c = getchar();
} else {
switch (precedence(getTopOPTR(OPTR), c)) {
case '<':
pushOPTR(&OPTR, c);
c = getchar();
break;
case '=':
popOPTR(&OPTR);
c = getchar();
break;
case '>':
theta = popOPTR(&OPTR);
b = popOPND(&OPND);
a = popOPND(&OPND);
pushOPND(&OPND, calculate(a, theta, b));
break;
}
}
}
printf("%.2lf\n", getTopOPND(OPND));
return 0;
}
SampleInput
(2.8+2.2)*(1.4+1.6)/5.0+2+5*2#
SampleOutput
Enter expression ended with '#':(2.8+2.2)*(1.4+1.6)/5.0+2+5*2#
15.00
最后,AI真tm香啊。