运算表达式求值c代码(用栈实现)


author: hjjdebug
date: 2026年 01月 12日 星期一 14:27:03 CST
descrp: 运算表达式求值c代码(用栈实现)


文章目录

  • 1. 运算是计算机的强项
  • 2 字符串解析函数
  • 3. 代码说明:
  • 4. 代码

计算机与人的接口. 让计算机理解人的意图.
计算机最擅长固定的操作, 它的要素是存储数据,对数据运算.
人机的接口必须要按照一种规则, 规则应该是越简单越好, 但也要符合人的习惯,不能迁就计算机.
我们熟知的运算表达式求值无疑就是最基础的人机交互接口.
规则是先计算括号内的值, 乘除运算高于加减运算

1. 运算是计算机的强项

至于运算,非常简单. 一个函数就能搞定.
假定数值是int型

// 计算函数
int applyOp(int a, int b, char op) {
switch (op) {
case ‘+’: return a + b;
case ‘-’: return a - b;
case ‘*’: return a * b;
case ‘/’: return a / b;
}
return 0;
}

关键是如何调用到这个函数. 调用逻辑怎样写,这就是程序框架.
而且用户的输入是灵活的, 它可能输入任何表达式, 并不会是固定的.

2 字符串解析函数

如何应对不同的字符串?

这离不开字符串解析函数. 由于字符串并不是固定的,所以必须按照约定的规则进行.
把字符串一个字符一个字符的进行分析, 分析出词,形成token, 这叫词法分析.
由词根据前后关系解析出意义这叫句法分析. 这个解析的过程都在主框架中.
把字符串分析完了,结果也就出来了.

3. 代码说明:

实现了基本的四则运算(+ - * /)和括号优先级处理
使用两个栈分别存储操作数和操作符
支持多位数操作数和空格分隔符
通过优先级函数控制运算顺序
主函数实现命令行交互

核心: 用一个栈来存储数据,用一个栈来存储操作符号.
当发现满足运算条件时,执行运算.

4. 代码

$ cat main.c#include<stdio.h>// for printf#include<stdlib.h>// for exit,malloc,free#include<string.h>// for strchr, strlen#include<assert.h>// for assert// 优先级函数intprecedence(charop){if(op=='+'||op=='-')return1;if(op=='*'||op=='/')return2;return0;}// 操作数判断intisDigit(charc){return(c>='0'&&c<='9');}// 计算函数intcalculate(inta,intb,charop){switch(op){case'+':returna+b;case'-':returna-b;case'*':returna*b;case'/':returna/b;}return0;}#defineAPPLY_OPERATOR\assert(val_index>=2);\assert(op_index>=1);\intval2=values[val_index-1];\val_index--;\intval1=values[val_index-1];\val_index--;\charop=ops[op_index-1];\op_index--;\values[val_index++]=calculate(val1,val2,op);// 求值函数intevaluate(char*exp){inti;intlen=strlen(exp);if(len==0)return0;// 万一是空串int*values=malloc(len*sizeof(int));// 操作数栈char*ops=malloc(len*sizeof(char));// 操作符栈intval_index=0,op_index=0;for(i=0;i<len;i++){if(exp[i]==' ')continue;// 忽略空格if(isDigit(exp[i])){intval=0;while(i<len&&isDigit(exp[i])){val=(val*10)+(exp[i]-'0');i++;}values[val_index++]=val;i--;// 调整索引}elseif(exp[i]=='('){ops[op_index++]=exp[i];}elseif(exp[i]==')'){while(op_index>0&&ops[op_index-1]!='('){APPLY_OPERATOR;}if(op_index>0&&ops[op_index-1]=='('){op_index--;}}elseif(strchr("+-*/()",exp[i])==NULL){printf("错误: 非法字符 '%c'\n",exp[i]);exit(EXIT_FAILURE);}else{while(op_index>0&&precedence(ops[op_index-1])>=precedence(exp[i])){APPLY_OPERATOR;}ops[op_index++]=exp[i];}}while(op_index>0){APPLY_OPERATOR;}intresult=values[0];free(values);free(ops);returnresult;}intmain(intargc,char*argv[]){/* char buf[1000]; printf("请输入运算表达式: "); char *p=fgets(buf, sizeof(buf), stdin); assert(p!=NULL); buf[strcspn(buf, "\n")] = 0; // 去除换行符 int result = evaluate(buf); */if(argc!=2){printf("Usage: %s expression\n",argv[0]);printf("Example: %s \"1+2*3\"\n",argv[0]);exit(0);}intresult=evaluate(argv[1]);printf("结果: %d\n",result);return0;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1149511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能实体侦测服务核心优势解析|高精度NER+动态彩色高亮

AI智能实体侦测服务核心优势解析&#xff5c;高精度NER动态彩色高亮 在信息爆炸的时代&#xff0c;非结构化文本数据如新闻、社交媒体内容、企业文档等呈指数级增长。如何从这些杂乱无章的文字中快速提取关键信息&#xff0c;成为提升信息处理效率的核心挑战。传统的关键词匹配…

别只看不练!30+程序员2个月转行大模型,2w+offer经验全分享,收藏这篇就够了!

30程序员2个月转行大模型&#xff0c;2woffer经验全分享&#xff0c;收藏这篇就够了&#xff01; 一位30北漂程序员在十年工作后感到职业瓶颈&#xff0c;决定转行大模型领域。文章详细分析了大模型两类岗位&#xff08;算法工程师和应用工程师&#xff09;&#xff0c;选择了…

大学生不要一边做一边怀疑

你有没有过这样的经历&#xff1a;面对一个任务&#xff0c;还没开始做就已经在心里反复纠结“我这样对吗&#xff1f;”“这样做能行吗&#xff1f;”结果时间一点点过去&#xff0c;事情却没多少进展。 我见过那些做事高效的人&#xff0c;他们的秘诀其实很简单——先动手&am…

避坑!AI分类器环境配置:为什么99%新手会失败

避坑&#xff01;AI分类器环境配置&#xff1a;为什么99%新手会失败 引言 作为一名自学AI的程序员&#xff0c;你是否经历过这样的噩梦&#xff1a;花了两周时间配置环境&#xff0c;结果各种版本冲突、依赖缺失、CUDA报错接踵而至&#xff1f;根据我的实战经验&#xff0c;9…

如何高效部署多语言翻译模型?HY-MT1.5镜像快速上手

如何高效部署多语言翻译模型&#xff1f;HY-MT1.5镜像快速上手 在跨语言交流需求日益增长的今天&#xff0c;高质量、低延迟的机器翻译能力已成为智能应用的核心基础设施。腾讯开源的 HY-MT1.5 系列翻译模型&#xff0c;凭借其“小模型快部署、大模型强性能”的双轨设计&#…

万能分类器图像分类实战:云端GPU 10分钟出结果,3块钱玩整天

万能分类器图像分类实战&#xff1a;云端GPU 10分钟出结果&#xff0c;3块钱玩整天 1. 为什么你需要云端GPU分类器&#xff1f; 作为一名摄影师&#xff0c;你可能遇到过这样的烦恼&#xff1a;数万张照片堆积在硬盘里&#xff0c;手动分类耗时耗力。家用电脑跑不动AI大模型&…

视觉代理新体验|Qwen3-VL-WEBUI助力Dify平台实现GUI操作自动化

视觉代理新体验&#xff5c;Qwen3-VL-WEBUI助力Dify平台实现GUI操作自动化 在AI技术快速演进的今天&#xff0c;多模态大模型正从“能看懂图像”迈向“能操作界面”的全新阶段。传统的视觉理解系统大多停留在图文描述、OCR识别或内容摘要层面&#xff0c;而新一代视觉语言模型…

AI视觉新突破:MiDaS单目深度估计实战应用与性能评测

AI视觉新突破&#xff1a;MiDaS单目深度估计实战应用与性能评测 1. 引言&#xff1a;从2D图像到3D空间感知的AI跃迁 在计算机视觉领域&#xff0c;如何让机器“理解”真实世界的三维结构一直是一个核心挑战。传统方法依赖双目立体视觉或多传感器融合&#xff08;如LiDAR&…

高效多语言互译新选择|基于HY-MT1.5大模型镜像实战解析

高效多语言互译新选择&#xff5c;基于HY-MT1.5大模型镜像实战解析 1. 引言&#xff1a;多语言翻译的工程挑战与HY-MT1.5的破局之道 在全球化数字服务快速发展的背景下&#xff0c;高质量、低延迟的机器翻译能力已成为企业出海、内容本地化和跨语言协作的核心基础设施。然而&…

AI分类竞赛夺冠秘籍:弹性GPU+万能分类器调优

AI分类竞赛夺冠秘籍&#xff1a;弹性GPU万能分类器调优 引言&#xff1a;为什么你需要这套方案&#xff1f; 参加Kaggle等AI竞赛时&#xff0c;决赛阶段往往面临一个关键挑战&#xff1a;当其他选手都在使用复杂模型集成和大量数据增强时&#xff0c;如何让自己的方案脱颖而出…

AI分类模型解释性:万能分类器决策可视化云端工具

AI分类模型解释性&#xff1a;万能分类器决策可视化云端工具 引言 在金融风控领域&#xff0c;AI分类模型已经成为不可或缺的分析工具。但传统模型往往存在一个痛点&#xff1a;它们能给出"是什么"的答案&#xff0c;却无法解释"为什么"。想象一下&#…

串口转网口通信:基于C++与Qt库的实现之旅

串口转网口通信源代码C语言Qt库 支持多路转换双向通信支持UDP和TCP客户端 提供&#xff0c;带注释&#xff0c;带设计文档 使用说明介绍 1.功能介绍&#xff1a; 完成了多路网口和串口数据转换的功能。 可实现串口接收到的数据&#xff0c;通过网口发送出去&#xff1b;而网口接…

GoLand 2026年1月最新版 2025.3.1 安装、授权、使用说明

2026-01-12亲测支持最新版本2025.3.1支持在线更新支持Windows、MAC、Linux 一 下载安装、更新 1. 官网下载最新版安装。 https://www.jetbrains.com/zh-cn/go/ 安装后以后先不要运行程序。 2. 如果已安装&#xff0c;则直接更新到最新版本即可。如果更新后激活失效&#xff0…

智能高亮+极速推理|AI智能实体侦测服务赋能信息抽取场景

智能高亮极速推理&#xff5c;AI智能实体侦测服务赋能信息抽取场景 副标题&#xff1a;基于RaNER模型的中文命名实体识别WebUI镜像实践指南 1. 引言&#xff1a;从非结构化文本中释放关键信息价值 在当今数据爆炸的时代&#xff0c;新闻、社交媒体、企业文档等渠道每天产生海…

分类模型联邦学习:万能分类器分布式训练+GPU集群

分类模型联邦学习&#xff1a;万能分类器分布式训练GPU集群实战指南 引言&#xff1a;当医院需要共享智慧却不共享数据时 想象一下这样的场景&#xff1a;A医院有10万张肺部CT影像数据&#xff0c;B医院有8万张乳腺X光片&#xff0c;C医院积累了12万份皮肤病病例。每家医院都…

为什么无线充需要Qi认证?

无线充做 Qi 认证的核心价值在于保障跨品牌兼容、守住安全底线、获取市场准入与品牌信任&#xff0c;不做则会陷入兼容混乱、安全失控、渠道受阻与侵权追责的困境&#xff0c;以下从必要性与后果两方面详细说明。一、为什么必须做 Qi 认证实现全球跨品牌互操作。Qi 是 WPC&…

Stable Diffusion+分类器联动教程:1小时1块玩转智能标注

Stable Diffusion分类器联动教程&#xff1a;1小时1块玩转智能标注 1. 引言&#xff1a;插画师的AI标注烦恼 作为一名插画师&#xff0c;你是否经常遇到这样的困扰&#xff1a;作品集越积越多&#xff0c;手动给每张图打标签耗时费力&#xff1b;想用AI自动标注&#xff0c;却…

Windows OLE零点击RCE漏洞分析:CVE-2025-21298调查实战

让我们一起来防御&#xff1a;调查CVE-2025-21298——Windows OLE零点击RCE&#xff08;事件ID&#xff1a;314&#xff09; 理解 CVE-2025–21298 CVE-2025–21298 是 Windows OLE&#xff08;对象链接与嵌入&#xff09;技术中的一个零点击漏洞&#xff0c;该技术用于实现文档…

沐曦C500适配HY-MT1.5全过程|vLLM框架下高效推理实践

沐曦C500适配HY-MT1.5全过程&#xff5c;vLLM框架下高效推理实践 1. 背景与挑战&#xff1a;国产算力开源大模型的协同需求 随着多语言交流场景的爆发式增长&#xff0c;高质量、低延迟的翻译模型成为智能客服、跨境通信、内容本地化等应用的核心基础设施。2023年底&#xff…

【WRF-VPRM WRF-GHG-Prepy工具】其五 背景场处理-初始/边界条件:CAMS-Inversion数据(函数解析)

目录 步骤 A:计算插值索引 calculate_CAMS-GACF_interpolation_indices.py 脚本详解 核心逻辑 (Function Logic) 输入文件 (Input Files) 输出文件 (Output Files) 步骤 B:运行初始和边界条件处理 prep_initial_cond_inversion.py (处理初始条件) prep_initial_cond_CO2-CH4_…