news 2026/6/10 15:55:47

【ACWing】151. 表达式计算4

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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为输入长度。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 18:53:31

QtC++定时3秒执行槽函数实战

记忆要点// 连接超时信号到槽函数QObject::connect(timer, &QTimer::timeout, &myObject, &MyClass::delayedSlot);1.QtC定时3秒执行槽函数实战在Qt C中实现3秒后执行槽函数&#xff0c;推荐使用QTimer的单次定时模式。以下是完整实现步骤和代码示例&#xff1a;核…

作者头像 李华
网站建设 2026/6/9 23:34:48

.NET 10 社区SDK(Loongarch 和 RISC-V)

一、Loongarch&#xff08;loongarch64 / Loongson&#xff09;上 .NET 10概览发布&#xff1a;v10.0.100-loongarch64&#xff08;tag&#xff09;发布者&#xff08;自动化&#xff09;&#xff1a;github-actions[bot]发布时间&#xff08;UTC&#xff09;&#xff1a;2025-…

作者头像 李华
网站建设 2026/6/10 14:00:46

【期末分析题与改错题】

文章目录一、程序分析题项目结构分析题01分析题02分析题03分析题04二、程序改错题项目结构改错题01改错题02改错题03改错题04改错题05改错题06一、程序分析题 项目结构 分析题01 代码&#xff1a; package ProgramAnalysis; /*** 1.定义一个二维数组arr&#xff0c;包含3行3…

作者头像 李华
网站建设 2026/6/9 23:52:18

每日八股——Go(4)

gRPC是什么&#xff1f; gRPC (Google Remote Procedure Call) 是一个由谷歌开发的高性能、开源的RPC&#xff08;远程调用&#xff09;框架。简单来说&#xff0c;他的核心目的是&#xff1a;让你调用远程服务器上的函数&#xff08;方法&#xff09;&#xff0c;就像调用本…

作者头像 李华
网站建设 2026/6/10 14:01:17

灌区PLC阀门远程监控运维系统方案

一、项目背景灌区作为农业用水的重要区域&#xff0c;其水资源的合理分配与高效利用直接关系到农业生产的稳定与发展。传统灌区管理方式中&#xff0c;PLC阀门往往依赖人工现场操作与监控&#xff0c;存在响应速度慢、管理效率低、资源分配不均等问题。随着物联网技术的发展&am…

作者头像 李华
网站建设 2026/6/10 13:59:18

Kubernetes集群升级指南

前言本文演示kubernetes集群从v1.24.1升级到v1.29.15。一、集群升级过程辅助命令&#xff08;1&#xff09;查看节点上运行的pod。kubectl get pod -o wide |grep <nodename>&#xff08;2&#xff09;查看集群配置文件。kubectl -n kube-system get cm kubeadm-config -…

作者头像 李华