力扣经典150题第五十三题:基本计算器

2024-05-06 05:12

本文主要是介绍力扣经典150题第五十三题:基本计算器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 力扣经典150题第五十六题:基本计算器
    • 示例
    • 提示
    • 解题思路

力扣经典150题第五十六题:基本计算器

给你一个字符串表达式 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 * 10^5
  • s 由数字、‘+’、‘-’、‘(’、‘)’、和 ’ ’ 组成
  • s 表示一个有效的表达式
  • ‘+’ 不能用作一元运算(例如, “+1” 和 “+(2 + 3)” 无效)
  • ‘-’ 可以用作一元运算(即 “-1” 和 “-(2 + 3)” 是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位 整数

解题思路

在进行表达式计算时,我们可以使用栈来保存数字和运算符,并在遇到右括号时进行计算。具体步骤如下:

  1. 初始化一个栈 stack 用于保存数字和运算符,一个变量 sign 用于保存当前运算的符号,默认为1。
  2. 遍历字符串 s ,遇到以下情况进行处理:
    • 遇到数字字符时,将其转换为数字并添加到当前数字 num 上。
    • 遇到 ‘+’ 符号时,将 sign 设为1。
    • 遇到 ‘-’ 符号时,将 sign 设为-1。
    • 遇到 ‘(’ 符号时,将当前数字 num 和运算符 sign 入栈,并分别重新置为1。
    • 遇到 ‘)’ 符号时,从栈中弹出前一个数字和运算符,进行运算,并将结果加到弹出的数字上。
    • 遇到空格时,跳过处理。
  3. 最后将栈中的所有数字相加得到结果。

以下是Java代码示例:

import java.util.Stack;public class BasicCalculator {public int calculate(String s) {Stack<Integer> stack = new Stack<>();int num = 0;int sign = 1;int result = 0;for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (Character.isDigit(c)) {num = num * 10 + (c - '0');} else if (c == '+') {result += sign * num;num = 0;sign = 1;} else if (c == '-') {result += sign * num;num = 0;sign = -1;} else if (c == '(') {stack.push(result);stack.push(sign);result = 0;sign = 1;} else if (c == ')') {result += sign * num;num = 0;result *= stack.pop();result += stack.pop();}}result += sign * num;return result;}public static void main(String[] args) {BasicCalculator calculator = new BasicCalculator();String s1 = "1 + 1";String s2 = " 2-1 + 2 ";String s3 = "(1+(4+5+2)-3)+(6+8)";System.out.println(calculator.calculate(s1)); // 输出:2System.out.println(calculator.calculate(s2)); // 输出:3System.out.println(calculator.calculate(s3)); // 输出:23}
}
此代码实现了基本计算器功能,通过栈来处理运算优先级,遇到括号时递归计算括号内的表达式。

这篇关于力扣经典150题第五十三题:基本计算器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963502

相关文章

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查