字符串表达式可被解析包含加减乘除取模和次幂运算的数学表达式

字符串表达式可被解析包含加减乘除取模和次幂运算的数学表达式

实现一个简单的表达式求值器,
例如char expression[] = "(27%4-2)*2+1";

可以解析包含加减乘除取模和次幂运算的数学表达式,

并计算出最终结果。通过递归解析表达式中的数字和运算符,

并按照运算符的优先级进行计算,最终输出表达式的计算结果。

先行判断优先级,再考虑运算的过程。

最终实现字符串表达式可被解析成真实的数学表达式并得出结果。

#include <stdio.h>
#include <ctype.h>
#include <math.h> // 引入pow函数

// 函数声明
int evaluate(char **s);

// 解析数字,包括括号内的表达式
int parseNumber(char **s) {
    if (**s == '(') {
        (*s)++; // 跳过左括号
        int num = evaluate(s); // 计算括号内的表达式
        (*s)++; // 跳过右括号
        return num;
    } else {
        int num = 0;
        while (isdigit(**s)) {
            num = 10 * num + (**s - '0');
            (*s)++;
        }
        return num;
    }
}

// 处理次幂运算
int evaluatePower(char **s) {
    int base = parseNumber(s);
    while (**s == '^') {
        (*s)++; // 跳过'^'
        int exponent = parseNumber(s); // 解析指数
        base = (int) pow((double) base, (double) exponent);
    }
    return base;
}

// 处理乘除求模运算
int evaluateMD(char **s) {
    int num = evaluatePower(s); // 先处理可能的次幂运算
    while (**s == '*' || **s == '/' || **s == '%') {
        char op = *(*s)++;
        int nextNum = evaluatePower(s); // 对于乘除,也要先处理次幂
        if (op == '*') {
            num *= nextNum;
        } else if (op == '/') {
            num /= nextNum;
        } else {
            num %= nextNum;
        }
    }
    return num;
}

// 评估整个表达式
int evaluate(char **s) {
    int result = evaluateMD(s);
    while (**s && **s != ')' && **s != '%') { // 修改条件,确保在遇到右括号或求模运算符时停止
        char op = *(*s)++;
        if (op == '+' || op == '-') {
            int nextNum = evaluateMD(s);
            if (op == '+') {
                result += nextNum;
            } else {
                result -= nextNum;
            }
        }
    }
    return result;
}

// 主函数
int main() {
    char expression[] = "(27%4-2)*2+1";
    char *p = expression;
    int result = evaluate(&p);
    printf("结果是: %d\n", result);
    return 0;
}
  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你会魔法吗✧(≖ ◡ ≖✿)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值