C语言学习学习笔记20260704-中缀表达式求值(双栈法) C语言学习学习笔记20260704-中缀表达式求值双栈法1. 题目概述目标计算包含、-、*和()的整数算术表达式的值。输入字符串s长度≤ \le≤100可能包含空格。输出计算结果整型。难点需要处理运算符优先级先乘除后加减。需要处理括号改变优先级。需要解析多位数字如 “123”。2. 核心算法双栈模拟这是解决此类问题的经典O ( n ) O(n)O(n)算法。我们需要维护两个栈栈名称作用存储内容nums(操作数栈)暂存等待计算的数字int类型的数值ops(运算符栈)暂存等待执行的运算符号char类型的,-,*,(算法流程图扫描字符从左向右遍历字符串。数字处理遇到数字则连续读取拼接成完整整数压入nums。左括号(直接压入ops作为优先级的“屏障”。右括号)触发计算不断弹出ops中的运算符进行计算直到遇到匹配的(为止。运算符 (,-,*)比较当前运算符与ops栈顶运算符的优先级。若栈顶优先级 高于 当前优先级说明栈顶的运算应该先执行例如栈顶是*当前是或者栈顶是*当前也是*。此时弹出并计算。重复上述过程直到栈空或栈顶是(或栈顶优先级更低。将当前运算符压入ops。收尾遍历结束后依次弹出ops中剩余运算符计算nums栈顶即为最终结果。3. 代码实现详解以下是基于 C 语言的完整实现#includestdio.h#includestring.h#includectype.h// 定义栈最大容量根据题目约束预留空间#defineMAXN1005/** * brief 计算带括号、加减乘的中缀整数表达式 */intsolve(char*s){intnums[MAXN];// 操作数栈charops[MAXN];// 运算符栈inttop_num0;// 数字栈指针inttop_op0;// 运算符栈指针intlenstrlen(s);inti0;while(ilen){charcs[i];// 1. 跳过空格if(c ){i;continue;}// 2. 解析数字处理多位数if(isdigit(c)){intnum0;while(ilenisdigit(s[i])){numnum*10(s[i]-0);i;}nums[top_num]num;continue;// 注意这里已经移动了 i不需要再 i}// 3. 左括号直接入栈if(c(){ops[top_op]c;}// 4. 右括号触发括号内计算elseif(c)){while(top_op0ops[top_op-1]!(){// 执行一次计算逻辑charopops[--top_op];intbnums[--top_num];intanums[--top_num];intres(op)?ab:((op-)?a-b:a*b);nums[top_num]res;}// 弹出对应的左括号if(top_op0)top_op--;}// 5. 处理普通运算符else{// 定义优先级* 为 2 - 为 1intcurr_pri(c*)?2:1;// 当栈非空且栈顶不是左括号时while(top_op0ops[top_op-1]!(){chartop_cops[top_op-1];inttop_pri(top_c*)?2:1;// 如果栈顶优先级 当前优先级先算栈顶的if(top_pricurr_pri){charopops[--top_op];intbnums[--top_num];intanums[--top_num];intres(op)?ab:((op-)?a-b:a*b);nums[top_num]res;}else{break;// 栈顶优先级低停止循环}}// 当前运算符入栈ops[top_op]c;}i;}// 6. 处理栈中剩余的运算符while(top_op0){charopops[--top_op];intbnums[--top_num];intanums[--top_num];intres(op)?ab:((op-)?a-b:a*b);nums[top_num]res;}returnnums[0];}4. 关键细节与易错点多位数解析不能只读一个字符就认为是数字。必须使用while(isdigit(...))循环读取并通过num num * 10 ...拼接。运算顺序减法/除法栈是后进先出LIFO。对于表达式a - b入栈顺序是先a后b。出栈计算时先弹出的是b右操作数后弹出的是a左操作数。代码体现int b nums[--top_num]; int a nums[--top_num]; res a - b;。优先级判断只有当栈顶优先级高于当前优先级时才弹栈计算。例如栈顶是*(2)当前是*(2)。因为乘法是从左往右算的所以先算前面的*条件成立。例如栈顶是(1)当前是*(2)。因为乘法优先级高后面的*应该先算所以不弹栈直接把*压进去。括号的处理左括号(在栈内时它的优先级被视为最低或者说是一个特殊的边界任何运算符都可以压在它上面。只有遇到右括号)时才会强制清空括号内的所有运算。

相关新闻

最新新闻

RBF神经网络滑模控制:抑制机械臂抖振的智能自适应方案

RBF神经网络滑模控制:抑制机械臂抖振的智能自适应方案

简介:本资源是一套面向控制工程与智能算法学习者的MATLAB实践方案,聚焦非线性系统控制难题,为二自由度机械臂设计RBF神经网络与滑模控制(SMC)融合的自适应控制器。资源包含完整可运行代码、理论推导文档与仿真结果可视…

2026/8/30 8:33:11
7年Java后端面试复盘:项目经验、高并发与系统设计核心考点

7年Java后端面试复盘:项目经验、高并发与系统设计核心考点

1. 这轮面试,7年老Java后端到底在被问什么 先交代一下背景:我2018年正式入行做Java后端,从传统单体应用做到现在的分布式微服务,经历过SSH、Spring Boot、Spring Cloud Alibaba几个大阶段,也带过小团队,做过…

2026/8/30 8:33:11
网易Java实习笔试考点全解析:从集合框架到JVM底层原理

网易Java实习笔试考点全解析:从集合框架到JVM底层原理

1. 先搞清楚网易JAVA实习笔试到底在考什么又是一年实习招聘季,我注意到"网易2018实习生招聘笔试题-JAVA开发实习生"这份题在Java求职圈里被反复翻出来讨论。原因不难理解:网易的笔试向来以基础扎实、考察面广著称,而2018年这份题又…

2026/8/30 8:33:11
灰狼优化算法GWO路径规划与多无人机航迹规划MATLAB实战

灰狼优化算法GWO路径规划与多无人机航迹规划MATLAB实战

简介:本资源是一套基于灰狼优化算法(GWO)的多场景航迹规划完整MATLAB实现方案,面向自动化、控制工程与智能无人系统方向的本科生课程设计及高年级期末大作业需求,聚焦路径规划、轨迹规划、轨迹优化及多智能体协同下的多…

2026/8/30 8:33:11
C#开发Basler工业相机读取教程:pylon SDK图像采集与触发配置

C#开发Basler工业相机读取教程:pylon SDK图像采集与触发配置

简介:本资源是一套面向工业视觉开发者的C#实战示例项目,聚焦Basler相机SDK集成与图像采集核心功能实现,适用于机器视觉工程师、自动化设备开发者及高校相关专业学生快速掌握相机控制关键技术。项目完整覆盖相机连接枚举、单帧/连续图像采集、…

2026/8/30 8:33:11
滴滴运维笔试真题解析:Linux、数据库与故障排查高频考点

滴滴运维笔试真题解析:Linux、数据库与故障排查高频考点

2017年秋天,网约车大战刚消停没多久,滴滴的业务量还在疯狂往上窜,那会儿我正好在准备秋招,投了不少互联网公司的运维岗。滴滴的笔试是让我印象比较深的一场——题量不算大,但考察面铺得很开,从Linux命令到网…

2026/8/30 8:28:11