当前位置: 首页 > news >正文

【题解-信息学奥赛一本通】1358:中缀表达式值(expr)

题目:1358:中缀表达式值(expr)

题目描述

输入一个中缀表达式(由0-9组成的运算数、加+减-乘*除/四种运算符、左右小括号组成。注意“-”也可作为负数的标志,表达式以“@”作为结束符),判断表达式是否合法,如果不合法,请输出“NO”;否则请把表达式转换成后缀形式,再求出后缀表达式的值并输出。

注意:必须用栈操作,不能直接输出表达式的值。

输入

一行为一个以@结束的字符串。

输出

如果表达式不合法,请输出“NO”,要求大写。

如果表达式合法,请输出计算结果。

时空限制

1s / 64MB

样例输入

1+2*8-9@

样例输出

8

代码

#include<bits/stdc++.h>usingnamespacestd;constintN=50+10;string s;structnode{intn;charc;}h[N];intsum;intk;inttt;charstk[N];boolf;intstk2[N],tt2;intpri(charx){switch(x){case'(':return4;case'*':return3;case'/':return3;case'+':return2;case'-':return2;case')':return1;}}boolisop(charc){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')')returntrue;returnfalse;}boolisvalid(){// 括号匹配charstkc[N];intttc=0;for(inti=0;i<s.size();i++){if(s[i]=='(')stkc[++ttc]=s[i];elseif(s[i]==')'){if(ttc>0)ttc--;elsereturnfalse;}}if(ttc>0)returnfalse;// 处理负号:将-x变为(0-x)for(inti=0;i<s.size();i++)if(s[i]=='-'&&(!i||isop(s[i-1])&&s[i-1]!=')')){intj=i+1;while(j<s.size()&&isdigit(s[j]))j++;string t=s.substr(i,j-i);s.replace(i,j-i,"(0"+t+")");}// 只有(可以作为开头,只有)可以作为结尾if(isop(s.front())&&s.front()!='(')returnfalse;if(isop(s.back())&&s.back()==')')returnfalse;// 连续两个运算符 )后不为(是合法的, (前不为)是合法的,其余均是不合法的for(inti=1;i<s.size();i++)if(isop(s[i-1])&&isop(s[i]))if(!(s[i-1]==')'&&s[i]!='('||s[i-1]!=')'&&s[i]=='('))returnfalse;returntrue;}intmain(){cin>>s;s.pop_back();//判断s是否合法if(!isvalid())puts("NO");else{// 将中缀表达式转为后缀表达式s+=')';f=false;for(inti=0;i<s.size();i++){if(s[i]>='0'&&s[i]<='9'){sum=sum*10+(s[i]-'0');f=true;}else{if(f){h[++k].n=sum;sum=0;f=false;}while(!(tt<=0||pri(stk[tt])<pri(s[i])||stk[tt]=='(')){h[++k].c=stk[tt];tt--;}if(tt>0&&s[i]==')')tt--;elsestk[++tt]=s[i];}}for(inti=1;i<=k;i++){if(h[i].c){intb=stk2[tt2];tt2--;inta=stk2[tt2];tt2--;switch(h[i].c){case'+':stk2[++tt2]=a+b;break;case'-':stk2[++tt2]=a-b;break;case'*':stk2[++tt2]=a*b;break;case'/':stk2[++tt2]=a/b;break;}}else{stk2[++tt2]=h[i].n;}}cout<<stk2[tt2];}return0;}

结果

参考

https://blog.csdn.net/lq1990717/article/details/123860584

http://www.jsqmd.com/news/1247041/

相关文章:

  • 7.5 其他工具生态《AI智能体应用开发》
  • 异步数据流水线与智能批处理:高性能数据处理架构解析
  • 在虚幻引擎蓝图中集成Rust:高性能模块与可视化脚本的融合实践
  • 提示工程架构设计:企业级AI交互的质量规范与实践
  • 市场封装齐全的AI算力芯片测试座生产商适配性强
  • Claude Code 使用限额提升50%:安装配置与高效使用全指南
  • 给 Claude Code 装上眼睛 - 聊聊 code intelligence plugin
  • 2026燕顺路街道彩色纸箱厂家推荐,纸箱包装厂家哪家好?源头工厂选购指南与避坑实用攻略 - geo88
  • 数据库日期类型转换:从字符串到datetime的实战指南
  • 数据类型与变量常量(下)
  • 多格式转换工具:从原理到实践,打造高效工作流
  • 服务接待中心与微服务网关
  • 多模态医学图像融合技术在精准医疗中的应用与实现
  • 数字时代的字符编码与字体显示问题解析
  • Oracle RAC中RMAN通道配置错误解析与优化实践
  • TM4C1294 GPIO寄存器级编程:从原理到实战的嵌入式开发指南
  • C++ String类实现:从零构建理解内存管理与STL核心机制
  • AI辅助编程实战:PyCharm与Cursor高效开发指南
  • OC角色动画制作:水仙走路Meme风格全流程解析
  • Windows C++原生截图实现:基于GDI+与CImage的指定区域捕获技术
  • TPS25751A PD控制器I2C接口与电源策略配置实战指南
  • DEA Performance 全局方向距离函数(Global DDF)模型手算验证报告
  • 广告✕搜索快链模式习近平对基础教育工作作出重要指示人民网新华网央视网中国网国际在线中国日报中经网光明网央广网07月23日 周四昆明7日天气QQ邮箱最近在看
  • 武汉江夏中职学校推荐|武汉榕霖职业技术学校免学费保就业 中考落榜生择校指南 - 湖北找学校
  • C/C++数组与指针核心区别及内存访问机制详解
  • 【AI】自驱动智能体
  • WAIC 中国AI产业趋势介绍
  • C++实现红外大气衰减模型:从比尔-朗伯定律到工程实践
  • C++17 std::atomic::is_always_lock_free 详解:无锁编程的性能保障与跨平台陷阱
  • 基于U-Net的岩石智能识别系统设计与实现