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

224. 基本计算器

224. 基本计算器

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()

示例 1:

输入:s = "1 + 1"

输出:2

示例 2:

输入:s = " 2-1 + 2 "

输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"

输出:23

提示:

  • 1 <= s.length <= 3 * 105

  • s 由数字、'+'、'-'、'('、')'、和 ' ' 组成

  • s 表示一个有效的表达式

  • '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)

  • '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)

  • 输入中不存在两个连续的操作符

  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

如何实现一个计算器 :: labuladong的算法小抄 (gitee.io)

思路:栈

当i遇到运算符时,将前一个num和sign入栈,然后再更新sign为当前运算符,num为0。

这里还额外实现了'*'、'/',为了做到先乘除后加减:

'+'、'-' 运算符只能给栈内push值,而'*'、'/' 运算符可以从栈内pop出被乘数或被除数,再将乘除运算后的结果push入栈内。

class Solution {
public:int calculate(string s){int index=0;return deal(s,index);}int deal(string& s,int& i) //注意:传入i的引用{stack<int> st;int num=0;char sign='+';//记录num前的符号,默认为'+'for(;i<s.size();i++){char c=s[i];if(c=='(')//遇到左括号,开始递归,求(...)算出的值{num=deal(s,++i);//因为传入的是i的引用,所以递归调用结束后,i此时就是与该'('对应的')'的下标}if(isdigit(c)){num=num*10+(c-'0');}if((!isdigit(c)&&c!=' ')||i==s.size()-1)//遇到运算符或者来到字符串末尾,将前一个num和sign入栈(跳过' '){int temp=0;switch(sign)//前一个num的符号{case '+':st.push(num);break;case '-':st.push(-num);break;case '*':temp=st.top();st.pop();st.push(temp*num);break;case '/':temp=st.top();st.pop();st.push(temp/num);break;}sign=c;//更新当前num的符号num=0;//更新num的值}if(c==')')//遇到右括号,结束递归break;}int res=0;while(!st.empty())//栈内所有的元素之和即为表达式之值{res+=st.top();st.pop();}return res;}
};

http://www.lryc.cn/news/26094.html

相关文章:

  • 微信小程序通过 node 连接 mysql——方法,简要原理,及一些常见问题
  • uni-app项目搭建和代码托管
  • win10+python3.6+cuda9+pytorch1.1.0安装
  • 【2023】某python语言程序设计跟学第二周内容
  • spring源码篇——BeanDefinition的注册
  • virtualbox7虚拟机中安装苹果macOS big sur系统详细教程
  • 用spectralayers 简单去一下人声做个伴奏
  • 高峰对话|深度探讨「多云与边缘」
  • 开发手册——一、编程规约_2.常量定义
  • Sandstorm 建设者亮点——2023 年 2 月
  • MyBatis快速入门
  • Mysql的一些提权方式(mysql提权、UDF)
  • 【2023】DevOps、SRE、运维开发面试宝典之Docker相关面试题
  • 圣杯布局的实现方式
  • RecastDemo用法
  • IIC总线式驱动开发(mpu6050)(二)
  • 盘点一下那些远程办公的神仙公司
  • Spring Cloud Alibaba全家桶(四)——微服务调用组件Feign
  • 安装pytorch
  • 自动化测试 Appium之Python运行环境搭建 Part2
  • LeetCode 2 - 两数相加
  • 用Python实现九九乘法表的几种方式,最简单只需一行代码
  • 入职外包三个月,我提桶跑路了
  • 企业邮箱对企业有哪些好处以及便捷性
  • ConvNeXt V2实战:使用ConvNeXt V2实现图像分类任务(一)
  • 3.2 报错整理
  • 从0开始学python -46
  • JavaScript事件委托机制详解
  • 【项目实战】MySQL中union和union all的相同点与不同点
  • ChatGPT最牛应用,让它帮你更新网站新闻吧!