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

【ACWing】151. 表达式计算4

题目地址:

https://www.acwing.com/problem/content/description/153/

给出一个表达式,其中运算符仅包含+,-,*,/,^(加 减 乘 整除 乘方)要求求出表达式的最终值。
数据可能会出现括号情况,还有可能出现多余括号情况。
数据保证不会出现大于或等于2 31 2^{31}231的答案。
数据可能会出现负数情况。
数据保证不会出现指数为负数的情况。
数据保证指数运算不会连续出现,例如2^2^3

输入格式:
输入仅一行,即为表达式。

输出格式:
输出仅一行,既为表达式算出的结果。

可以用双栈的方法来做。这道题有很多需要注意的点:

  1. 为了让栈里最后只剩下一个数,而不是出了循环还要继续做运算,我们可以用一对小括号把输入包起来;
  2. 为了使得括号平衡,我们需要预处理一下,补齐缺失的括号;
  3. 需要额外处理减号作为负号的情形。减号应该被当成负号,当且仅当,其之前的字符不是数字也不是左括号;如果负号之后是左括号,我们需要将-(变成-1*(,这样好处理,即符号栈加入*,数字栈加入-1;如果负号之后是数字,我们直接将数字截取出来即可。

代码如下:

#include<iostream>#include<stack>usingnamespacestd;usingll=longlong;string s;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr);cin>>s;s='('+s+')';intl=0,r=0;for(charch:s){if(ch=='(')l++;elseif(ch==')')r++;}if(l>r)s=s+string(l-r,')');if(l<r)s=string(r-l,'(')+s;autof=[](charop){switch(op){case'(':return0;case'+':case'-':return1;case'*':case'/':return2;case'^':return3;default:return-1;}};stack<ll>stk;stack<char>ops;autocalc=[](auto&stk,auto&ops){charop=ops.top();ops.pop();if(op=='('||op==')')return;ll y=stk.top();stk.pop();ll x=stk.top();stk.pop();if(op=='+')stk.push(x+y);elseif(op=='-')stk.push(x-y);elseif(op=='*')stk.push(x*y);elseif(op=='/')stk.push(x/y);else{if(!x)stk.push(0);else{ll res=1;while(y){if(y&1)res*=x;y>>=1;x*=x;}stk.push(res);}}};for(inti=0;i<s.size();i++){charch=s[i];if(isdigit(ch)){intj=i;ll x=0;while(isdigit(s[j]))x=x*10+s[j++]-'0';i=j-1;stk.push(x);}elseif(ch=='(')ops.push('(');elseif(ch==')'){while(ops.top()!='(')calc(stk,ops);ops.pop();}elseif(ch=='-'&&i&&!isdigit(s[i-1])&&s[i-1]!=')'){if(s[i+1]=='('){stk.push(-1);ops.push('*');}else{intj=i+1;ll x=0;while(isdigit(s[j]))x=x*10+s[j++]-'0';stk.push(-x);i=j-1;}}else{while(f(ops.top())>=f(ch))calc(stk,ops);ops.push(ch);}}printf("%lld\n",stk.top());}

时空复杂度O ( n ) O(n)O(n)n nn为输入长度。

http://www.cnnetsun.cn/news/114487.html

相关文章:

  • 地铁调研12-17
  • 现代软件测试工具全景对比与选型指南
  • 基于 Apache POI 的体检报告 Word 生成实战文档
  • org.jetbrains.annotations的@Nullable 学习
  • 计算机毕业设计springboot计算机硬件自配系统 基于Spring Boot的计算机硬件配置管理系统设计与实现 Spring Boot架构下的计算机硬件自选系统开发
  • 【信创】中间件对比
  • 傅里叶变换小波变换
  • 智能桑拿房首选:水管家集成系统如何提升体验?
  • 最简单的LangChain和RAG
  • 空压机监控运维管理系统方案
  • 实习面试题-Rust 面试题
  • 视频字幕精确生成方法 用到字幕api开发文档
  • React Fiber 架构解析:如何利用 `requestIdleCallback` 实现时间切片(Time Slicing)
  • SPA 应用中的路由切换内存泄漏:未注销的 Scroll 监听与全局变量
  • 游泳池漆专用施工涂料如何选?专业视角解析耐水抗氯性能
  • 中国RFID设备十大企业综合实力解析
  • C#静态成员总结 常量与只读字段总结 类的继承总结
  • 都说东莞有好的AI销售厂家,实际情况真如此吗?
  • Python开发者必看:一行代码切换GPT-5.2与DeepSeek V3.2,企业级大模型中台搭建实录
  • 浏览器代理实现理想数据抓取
  • LeetCode 01 背包 完全背包 题型总结
  • ubuntu通过公网Ubuntu服务器远程桌面连接私网IPUbuntu
  • Unity学习笔记(十九)GUI控件(三)
  • IPA 深度混淆是什么意思?分析其与普通混淆的区别
  • 33、Linux 内存管理全解析
  • 5.回溯算法
  • 嵌入式模组温控策略
  • 【昇腾CANN训练营·架构篇】打破内存墙:Ascend C 算子融合(Operator Fusion)的极致心法
  • 【昇腾CANN训练营·算法篇】寻找消失的除法器:Newton Iteration 与高精度数学计算的艺术
  • 19、Linux 帧缓冲接口设计与图形库应用