千家信息网

C语言如何实现数学表达式运算

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,C语言如何实现数学表达式运算,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。大家分享了C语言实现数学表达式运算的具体代码,具体内容如下
千家信息网最后更新 2026年11月01日C语言如何实现数学表达式运算

C语言如何实现数学表达式运算,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

大家分享了C语言实现数学表达式运算的具体代码,具体内容如下

1、开发思路: (假设有表达式 2 * 3 * ( 1 + 2) )

数字要一个一个取出放在内存中,根据相邻前后2个计算符号,判断是否要取出数字进行计算,2个数字的计算值重新放在内存中且顺序放置。考虑使用栈这种数据结构去保存数字和符号,用2个栈,1个栈保存数字,一个栈保存运算符号。

2、因要使用栈这种数据结构,本代码使用纯C语言开发,故先编写栈的代码,参考:
c语言实现通用数据结构(三):通用椎栈

3、重要处理逻辑

(1)如何判断前后2个运算符的优先级关系

(2)如何字符转换为数字

因键盘输入的内容为字符类型,需要判断输入的字符类型且进行必要转换
ASCII码表,表头依次为:二进制 十进制 十六进制 字符

(3)如何判断表达式处理完毕

默认先预置一个符号#,输入内容2 * 3 * ( 1 + 2)# ,当符号栈内为#,且当前处理的字符为#。则表达式处理完毕。

4、代码实现

#define _CRT_SECURE_NO_DEPRECATE#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1#include #include #include "myStack.h"// 判断是否操作符int ifOp(char c) {    switch (c) {    case '+':        return 1;    case '-':        return 1;    case '*':        return 1;    case '/':        return 1;    case '(':        return 1;    case ')':        return 1;    case '#':        return 1;    default:        break;    }    return 0;}int findOffset(char * str,char c,int len) {    for (int i = 0; i < len;i++) {        if (str[i] == c) {            return i;        }    }    return -1;}//判断任意相继出现的2个运算符的优先级char yxji(char op1,char op2) {    char ops[] = "+-*/()#";    char oplist[7][7] = {         ">><<<>>",        ">><<<>>",        ">>>><>>",        ">>>><>>" ,        "<<<<<=&",        ">>>>&>>",        "<<<<<&="};    int len = sizeof(ops) / sizeof(char);    return oplist[findOffset(ops,op1, len)][findOffset(ops, op2, len)];}//基础运算 a-第1个数  b-第2个数void baseOp(char op,int a,int b,int * value) {    printf("baseOp %d %c %d",a,op,b);    //int value = 0;    //int* p = &value;    switch (op) {    case '+':        *value = a + b;        break;    case '-':        *value = a-b;        break;    case '*':        *value = a*b;        break;    case '/':        *value = a/b;        break;    default:        printf("运算符不合法");        exit(1);    }}//转换字符为数字void transValue(char  c,int * v) {    if (c > 47 && c < 58) {        *v =  (c - 48);    }}void printstack(MyStack * stack1,MyStack * stack2) {    int len1 = myListGetSize(stack1);    int len2 = myListGetSize(stack2);    printf("stack1值:");    for (int i = 0; i < len1;i++) {        char* m = (char*)myListGetDataAt(stack1,i );        printf("%c ", *m);    }    printf("\nstack2值:");    for (int i = 0; i < len2; i++) {        int* m = (int*)myListGetDataAt(stack2, i);        printf("%d(%p) ", *m,m);    }    printf("\n");}// 计算,该方法只能对数字 0-9 运算(可掌握栈、指针的使用)// 2*3*(1+2)#void calculate(char bds[]) {    int i = 0;    char flag = '#';    MyStack* stack1 = createMyStack();//stack1中放运算符    myStackPush(stack1, &flag);    MyStack* stack2 = createMyStack();//stack2中放数字    //char c = bds[i]; // 等价于*(bds+i)     while (bds[i] != '#' || *(char*)myStackGetTop(stack1)!='#') {        printstack(stack1,stack2);        if (!ifOp(bds[i])) {             /*             *  这种写法不行!                 int vv = 0;                 transValue(bds[i], &vv)             */            int* vu = (int*)malloc(sizeof(int));            transValue(bds[i], vu);            printf("is number:%d\n", *vu);//打印出数字            myStackPush(stack2, vu);            i++;        }        else {            printf("is fuhao:%c\n", bds[i]);            char * op1 = (char*)myStackGetTop(stack1);            printf("top1 op:%c\n",*op1);            if (*op1 == '#') {                myStackPush(stack1, &bds[i]);                i++;                continue;            }            char res = yxji(*op1, bds[i]);            printf("yxji:%c\n",res);            switch (res) {                case '>':{                    char* curop = (char*)myStackPop(stack1);//取出当前运算符                    printf("top2 op:%c\n", *op1);                    int* b = (int*)myStackPop(stack2);//第2个运算数                    int* a = (int*)myStackPop(stack2);//第1个运算数                    /*                    *  这种写法不行!                         int value = 0;                        baseOp(*curop,transValue(*a), transValue(*b),&value);                    */                    int* value = (int*)malloc(sizeof(int));                    baseOp(*curop, *a, *b, value);                    printf("=%d\n", *value);                    myStackPush(stack2, value);                    break;                }                case '<':                    myStackPush(stack1, &bds[i]);                    i++;                    break;                case '=': {                    printf("()==");                    myStackPop(stack1);//取出右括号 (                    i++;                    break;                }                default:                    printf("表达式错误!");                    exit(1);            }        }    }    int * valueRes = (int*)myStackPop(stack2);    printf("计算结果值为:%d\n",*valueRes);    freeMyList(stack1);    freeMyList(stack2);}int main() {    printf("输入表达式:\n");    char bds[50];    scanf("%s",bds);// 数组变量名,传入的相当于是数组第一个元素的地址。方法形参是个指针变量,指针变量才能存放地址    calculate(bds);    return 0;}

5、代码开发过程总结 (踩坑填坑真实记录)
将符号转为数字并把数字放入栈中,若写为如下形式不行
int vv = 0;
transValue('1', &vv);
myStackPush(stack2, vv);
因为临时变量地址始终不变,第2个值赋值后,等于是把已放入栈内的第一个值修改了(程序中通过打印出指针变量值,即变量的地址,发现地址确实没变)
应该用如下方式:
int* vv= (int*)malloc(sizeof(int));
transValue('1', vv);
myStackPush(stack2, vv);
掌握指针用法很重要!此处记录如下:


6. 代码测试结果(开发环境:visual studio 2019)


关于C语言如何实现数学表达式运算问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

表达式 运算 数字 代码 符号 语言 变量 地址 字符 内容 指针 处理 开发 输入 数学 数据 数据结构 结构 问题 不行 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 深圳恒合互联网络科技有限公司 互联网科技官网 互联网巨头反垄断金融科技 金融科技与互联网金融 互联网科技公司发展 互联网 的科技创新 上海卓越科技 互联网 互联网科技大会案例 福州新华互联网科技学校 知乎 中化能源互联网科技招聘 速维有品互联网信息科技(苏州)有限公司 消费医药和互联网科技 链环科技传统企业怎么转型互联网 科技类公司包括互联网吗 阿里互联网科技企业 互联网硬科技公司 米泉互联网科技专业怎么样 互联网企业和网络科技有限公司 高科技和互联网的现代国家 保险科技 互联网保险 西安纸贵互联网科技有限公司 火传媒上海互联网科技 科技类的互联网平台 昭通互联网科技选哪家 为客找房互联网科技公司怎么样 众安科技工业互联网合作 高科技互联网套路 城市宝互联网科技有限公司 互联网企业和网络科技有限公司
0