224. 基本计算器

news2024/11/14 20:14:03

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.coloradmin.cn/o/383087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Pygame实战】变异狗大战:据说是最近还不错的小游戏,这一个个玩到表情崩坏,点开即玩,赶紧来~(Python代码搞笑版本)

前言 只有你想不到&#xff0c;没有我找不到写不了的好游戏&#xff01; 哈喽。我是你们的栗子同学啦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 今天小编去了我朋友家里玩儿&#xff0c…

ExSwin-Unet 论文研读

ExSwin-Unet摘要1 引言2 方法2.1 基于窗口的注意力块2.2 外部注意力块2.3 不平衡的 Unet 架构2.4 自适应加权调整2.5 双重损失函数3 实验结果3.1 数据集3.2 实现细节3.3 与 SOTA 方法的比较3.4 消融研究4 讨论和限制5 结论数据集来源&#xff1a; https://feta.grand-challenge…

图扑 Web SCADA 智慧制硅厂,打造新时代制硅工业

前言 我国目前是全球最大的工业硅生产国、消费国和贸易国&#xff0c;且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识&#xff0c;随着我国“双碳”目标的推进&#xff0c;光伏产业链快速发展&#xff0c;在光伏装机需求的带动下&#…

武汉凯迪正大KD305系列智能数字绝缘电阻测试仪

一、概述 KD305系列智能数字绝缘电阻测试仪采用嵌入式工业单片机实时操作系统&#xff0c;数字模拟指针与数字段码显示结合&#xff0c;该系列表具有多种电压输出等级&#xff08;500V、1000V、2500V、5000V、10000V&#xff09;、容量大、抗干扰强、模拟指针与数字同步显示、交…

数据结构考研习题精选

&#xff11; A假设比较&#xff54;次&#xff0c;由于换或不换&#xff0c;则必然有&#xff12;&#xff3e;&#xff54;种可能。又设有&#xff4e;个关键字&#xff0c;&#xff4e;&#xff01;排列组合&#xff0c;则必然有&#xff12;&#xff3e;&#xff54;&…

vue-element-admin执行npm install时的一些报错。

文章目录1. 首先在gitee上拉取的中文版2. 执行npm install的一些报错3. 参考文章1. 首先在gitee上拉取的中文版 git clone -b i18n https://gitee.com/panjiachen/vue-element-admin.git 2. 执行npm install的一些报错 npm install Please make sure you have the correct acc…

跨境电商平台,亚马逊、eBay、Shopee……哪个好?

2023一开始&#xff0c;随着各项利好政策的出台&#xff0c;中国跨境电商正在重新步入最好的时代。一些跨境电商企业纷纷开启上市热潮&#xff0c;身边许多人也跃跃欲试想转行跨境电商。专业数据显示&#xff0c;接下来将会有更多的跨境企业走向资本化的道路&#xff0c;借助资…

设备运行状况不能远程手机查看。难道就妥协吗?为何不试试这个办法

一、背景 随着国家经济结构逐步调整&#xff0c;纺织行业自动化、智能化水平逐步提高&#xff0c;业内竞争程度也将加大&#xff1b;整个市场变化快&#xff0c;并呈现出智能化、通用化、网络化、复杂化的新发展趋势。客户订单小批量、个性化、快速交货的特点越来越明显&#…

阅读(1)-----六级

目录 1.单词不懂怎么办&#xff1f; 1.1构词法 1.2上下文 2.句子不通怎么办&#xff1f; 3.时间不够怎么办 &#xff1f; 4.题型 4.1细节题 问文章的细节 4.2主旨题(文章主旨和段落主旨) 4.3语义题 4.4观点题 &#xff08;一共三种&#xff0c;支持、反对和中立 &…

从0开始学python -47

Python CGI编程 -2 GET和POST方法 浏览器客户端通过两种方法向服务器传递信息&#xff0c;这两种方法就是 GET 方法和 POST 方法。 使用GET方法传输数据 GET方法发送编码后的用户信息到服务端&#xff0c;数据信息包含在请求页面的URL上&#xff0c;以"?"号分割…

【面试题】社招中级前端笔试面试题总结

大厂面试题分享 面试题库后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库typeof null 的结果是什么&#xff0c;为什么&#xff1f;typeof null 的结果是Object。在 JavaScript 第一个版本中&#xff0c;所有值都存储在…

Nginx的反向代理配置笔记

1、反向代理的概念&#xff1a; 对一个大型网站来说&#xff0c;随着网站的访问量的快速增长&#xff0c;单台服务器已经无法承担大量用户的并发访问&#xff0c;必须采用多态服务器协同工作&#xff0c;以提高计算机系统的处理能力。通过Nginx提供的反向代理和负载均衡功能&a…

扬帆优配|国家队重磅出手!千亿巨头突然爆雷,股价狂跌12%!

国家队又出手啦&#xff01; 综合天眼查和国家商场监督管理总局旗下企业信用信息公示系统显现&#xff0c;长江存储科技控股有限责任公司股东结构新增国家集成电路工业出资基金二期股份有限公司、长江工业出资集团有限公司及湖北长晟开展等股东。其中&#xff0c;大基金二期认缴…

Mysql主键约束和唯一约束

Mysql约束 1、作用 约束定义为确保数据完整性必须遵循的规则。 约束可以在创建表的过程中创建&#xff0c;也可以稍后再添加。 在创建表后添加约束时&#xff0c;它将检查现有数据以确定其是否违背该约束。 如果现有数据违背了将添加的约束&#xff0c;那么将不会向指定列施加…

肠道短链脂肪酸如何让人变胖或变瘦

谷禾健康 在目前的审美中&#xff0c;无论男性或女性的肥胖都是不太加分项。除此之外&#xff0c;肥胖还被认为是几种疾病的重要标志物&#xff0c;特别是高血压、2 型糖尿病 (T2DM) 和代谢综合征&#xff0c;肥胖在这些疾病中发挥着明确而重要的病理作用。 肥胖的发生有多种病…

从0开始学python -46

Python CGI编程 什么是CGI CGI 目前由NCSA维护&#xff0c;NCSA定义CGI如下&#xff1a; CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如&#xff1a;HTTP服务器&#xff0c;提供同客户端HTML页面的接口。 网页浏览 为了更好的了解CGI是如何工作…

linux部署kafka

kafka部署需要jdk、zookeeper、 kafka kafka和zookeeper资源自取&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1410lRItcS4yG5DYmAyYOLg 提取码&#xff1a;rt01 1.jdk部署 略 2.zookeeper部署 2.1 解压 unzip zookeeper-3.4.11.zip 2.2 修改 conf/zoo.cfg 2…

详解物联网常用协议:IIC和RS485通信协议

在单片机开发中我们经常会听到协议二字&#xff0c;协议是单片机相互通信中必须遵守的规则&#xff0c;只有遵守协议才能实现二者之间的通信。协议的种类非常的多&#xff0c;可以满足不同设备和不同操作系统的通信要求&#xff0c;下面小编给大家介绍沐渥科技常用的两种通信协…

一文带你吃透JSP,增删改查实战案例详细解读

文章目录前言JSP 概述JSP快速入门搭建环境导入JSP依赖创建 JSP 页面编写代码测试JSP原理JSP 脚本实战案例JSP缺点发展阶段EL 表达式概述实战案例域对象JSTL 标签用法1用法2前言 不得不说&#xff0c;JSP 现在已经是一门十分老旧的技术了&#xff0c;学习编程时&#xff0c;不仅…

一文说清Kubernetes的本质

文章目录Kubernetes解决了什么问题&#xff1f;Kubernetes的全局架构Kubernetes的设计思想Kubernetes的核心功能Kubernetes如何启动一个容器化任务&#xff1f;Kubernetes解决了什么问题&#xff1f; 编排&#xff1f;调度&#xff1f;容器云&#xff1f;还是集群管理&#xf…