要求:
优化表达式求值算法,使得该算法可实现多位整数甚至浮点数的四则运算,并写程序进行验证
一下代码由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香啊。