实验5-表达式求值算法

 要求:

优化表达式求值算法,使得该算法可实现多位整数甚至浮点数的四则运算,并写程序进行验证

一下代码由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香啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值