news 2026/3/27 19:02:41

【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/3/14 11:52:31

构建软件质量防线:测试缺陷的系统性预防措施

在快速迭代的软件开发环境中&#xff0c;缺陷发现得越晚&#xff0c;修复成本就呈指数级增长。研究表明&#xff0c;生产环境中发现的缺陷其修复成本是编码阶段发现的100倍以上。因此&#xff0c;现代软件测试已从单纯的缺陷检测向缺陷预防演进&#xff0c;致力于在缺陷产生前构…

作者头像 李华
网站建设 2026/3/26 7:37:16

构建高效可持续的自动化测试框架:从架构设计到落地实践

随着敏捷开发与DevOps实践的普及&#xff0c;自动化测试已成为保障软件质量的核心环节。2025年的今天&#xff0c;现代应用架构正朝着微服务、云原生和智能化的方向演进&#xff0c;这对测试框架的适应性、可维护性和扩展性提出了更高要求。一个设计良好的自动化测试框架不仅能…

作者头像 李华
网站建设 2026/3/26 0:21:15

自动化测试维护策略:构建可持续的测试资产

随着敏捷开发和DevOps实践的普及&#xff0c;自动化测试已成为软件质量保障的核心环节。然而&#xff0c;许多团队在享受自动化测试带来的效率提升时&#xff0c;却面临着测试用例老化、维护成本飙升、ROI持续下降的困境。据统计&#xff0c;超过60%的自动化测试失败并非源于产…

作者头像 李华
网站建设 2026/3/26 8:29:52

二叉树的相关知识以及代码实现(Java)

一、二叉树的定义与基本概念二叉树是一种非线性数据结构&#xff0c;每个节点最多包含 2 个子节点&#xff08;左子节点、右子节点&#xff09;&#xff0c;核心特点&#xff1a;&#xff08;1&#xff09;每个节点的子树数量不超过 2&#xff1b;&#xff08;2&#xff09;左、…

作者头像 李华
网站建设 2026/3/27 4:22:57

pandas基础操作

文章目录 1. Series 与 DataFrame2. 数据查看与基本信息获取3. 数据选择与筛选4. 数据清洗与预处理5. 数据排序与重置索引6. 数据分组与聚合分析7. 数据合并 1. Series 与 DataFrame Series&#xff1a;一维带标签数组&#xff0c;类似于 Excel 中的单列数据 import pandas a…

作者头像 李华
网站建设 2026/3/26 19:27:49

泳池智能水管家推荐:5款高性价比设备实测解析

泳池智能水管家推荐&#xff1a;5款高性价比设备实测解析在洗浴行业竞争日益激烈的今天&#xff0c;水质管理正成为决定用户复购率的核心因素。当浴室能够实现“无呛鼻氯味、水体清澈透亮、皮肤泡后不痒、空气清新舒适”的体验时&#xff0c;其竞争力便已悄然超越传统服务模式。…

作者头像 李华