LeetCode(54)基本计算器【栈】【困难】

在这里插入图片描述

目录

    • 1.题目
    • 2.答案
    • 3.提交结果截图

链接: 基本计算器

1.题目

给你一个字符串表达式 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位 整数

2.答案

class Solution {public int calculate(String s) {s = s.replace(" ", "");char[] chars = s.toCharArray();Stack<String> stack = new Stack<>();for (int i = 0; i < chars.length; i++) {char c = chars[i];if (Arrays.asList('+', '-', '(').contains(c)) {stack.push(String.valueOf(c));} else if (c == ')') {List<String> subList = new ArrayList<>();while (!"(".equals(stack.peek())) {subList.add(stack.pop());}stack.pop();String num = subList.get(subList.size() - 1);for (int j = subList.size() - 2; j >= 0; j--) {String operator = subList.get(j--);String numRight = subList.get(j);num = operate(operator, num, numRight);}// 判断前面是否有一元操作符-boolean isNegative = stack.size() == 1 && "-".equals(stack.peek()) ||stack.size() > 1 && "(".equals(stack.get(stack.size() - 2)) && "-".equals(stack.peek());if (isNegative) {int number = Integer.parseInt(num);if (number < 0) {// --得+stack.pop();stack.push(String.valueOf(-1 * number));} else {stack.push(stack.pop() + num);}} else {stack.push(num);}} else if (c >= '0' && c <= '9') {boolean isNumber = stack.size() > 0 && isNumber(stack.peek());// 判断前面是否有一元操作符-boolean isNegative = stack.size() == 1 && "-".equals(stack.peek()) ||stack.size() > 1 && "(".equals(stack.get(stack.size() - 2)) && "-".equals(stack.peek());if (isNumber || isNegative) {stack.push(stack.pop() + c);} else {stack.push(String.valueOf(c));}}}String num = stack.get(0);for (int j = 1; j < stack.size(); j++) {String operator = stack.get(j++);String numRight = stack.get(j);num = operate(operator, num, numRight);}return Integer.parseInt(num);}private String operate(String operator, String numLeft, String numRight) {switch (operator) {case "+": return String.valueOf(Integer.parseInt(numLeft) + Integer.parseInt(numRight));case "-": return String.valueOf(Integer.parseInt(numLeft) - Integer.parseInt(numRight));default:System.out.println("operate() error, operator: " + operator);return "0";}}private boolean isNumber(String s) {return s.matches("-?[0-9]+");}
}

3.提交结果截图

在这里插入图片描述

整理完毕,完结撒花~ 🌻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263251.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中Shader黑白阀值后处理效果

文章目录 前言一、我们先来PS看一下黑白阀值的效果二、使用step(a,b)函数实现效果三、实现脚本控制黑白阀值1、在Shader属性面板定义控制阀值变量2、把step的a改为_Value3、在后处理脚本设置公共成员变量,并且设置范围为&#xff08;0&#xff0c;1&#xff09;4、在Graphics.B…

一文学会使用 PyInstaller 将 Python 脚本打包为 .exe 可执行文件

文章目录 前言PyInstaller特点跨平台支持自动依赖项处理单文件发布支持图形用户界面&#xff08;GUI&#xff09;和命令行界面&#xff08;CLI&#xff09;应用支持多种打包选项 基本用法常用参数其它参数 版本 & 环境实现步骤安装 PyInstaller创建 Python 脚本使用 PyInst…

显存优化 Trick(gradient_accumulation、gradient_checkpointing、xformers)

目录 Out of MemoryGradient AccumulationGradient CheckpointingXformersDiffusers的显存优化 Out of Memory 先来说下OOM问题&#xff0c;其实也是日常会遇到的情况。模型申请的显存超过了设备实际显存大小&#xff0c;则会报错Out of Memory。一般情况下&#xff0c;batch …

C++-引用和指针区别

文章目录 1.变量的组成2.指针2.1 定义2.2 使用指针操作变量2.3 为什么使用指针 3.引用3.1 定义3.2 引用注意事项 4.引用和指针的区别 1.变量的组成 变量的组成&#xff1a;变量地址&#xff0c;变量名&#xff0c;变量值 例&#xff1a; int i 12;2.指针 2.1 定义 指针用于存…

java--Calendar

1.Calendar ①代表的是系统此刻时间对应的日历 ②通过它可以单独获取、修改时间中的年、月、日、时、分、秒等(月份是从0开始的)。 2.Calender日历类的常见方法 注意&#xff1a;calender是可变对象&#xff0c;一旦修改后其对象本身表示的时间将产生变化。

Vue3-02-ref() 响应式详解

ref() 是什么 ref() 是一个函数&#xff1b; ref() 函数用来声明响应式的状态&#xff08;就是来声明变量的&#xff09; ref() 函数声明的变量&#xff0c;是响应式的&#xff0c;变量的值改变之后&#xff0c;页面中会自动重新渲染。ref() 有什么特点 1.ref() 可以声明基础…

Idea 插件开发: Swing Designer设计器创建的组件全部为空问题记录

问题现象 通过Swing 设计器创建的对象, Swing组件全部是空的, 导致ToolWindowFactory工厂的实现类调用时候出现了空指针异常 如下方式创建的 问题分析 问题出现时候, 同时给我生成了一个createUIComponents的私有方法, 由于个人当时理解有误, 把他当成了初始化方法, 在里面…

程序员的养生之道

程序员的养生之道 1 对程序员的初次印象2 我的养生之道2.1 规律作息&#xff1a;2.2 合理饮食&#xff1a;2.3 健康饮食&#xff1a;2. 4 增强锻炼&#xff1a;2. 5 心态平和&#xff1a;2. 6 生活习惯&#xff1a;2.7 定期体检&#xff1a;2.8 特殊注意&#xff1a;2.9 补充能…

2-3、运算符

语雀原文链接 文章目录 1、算术运算符2、关系运算符3、逻辑运算符4、赋值运算符5、移位运算符6、位运算符(二进制位进行运算)7、条件运算符:三目运算符8、运算符的优先级 1、算术运算符 &#xff1a;加法-&#xff1a;减法*&#xff1a;乘法/&#xff1a;除法取商%&#xff1…

“创未来,享非凡“ 昇腾AI开发者创享日广州站圆满成功

在羊城广州的科技新风潮中&#xff0c;一个以创新为核心、以智能为驱动的盛会在这座南国明珠城市如火如荼地展开。这不仅是一场技术的盛宴&#xff0c;更是人工智能产业发展动力的一次集结。 12月9日&#xff0c;在广州市工业和信息化局的倡导下&#xff0c;一场主题为“创未来…

【C++数据结构 | 字符串速通】10分钟秒杀字符串相关操作 | 字符串的增删改查 | 字符串与数组相互转换

字符串 by.Qin3Yu 文中所有代码默认已使用std命名空间且已导入部分头文件&#xff1a; #include <iostream> #include <string> using namespace std;概念速览 字符串是一种非常好理解的数据类型&#xff0c;它用于存储和操作文本数据。字符串可以包含任意字符…

data_loader返回的每个batch的数据大小是怎么计算得到的?

data_loader是一个通用的术语&#xff0c;用于表示数据加载器或数据批次生成器。它是在机器学习和深度学习中常用的一个概念。 一、data loader 数据加载器&#xff08;data loader&#xff09;是一个用于加载和处理数据集的工具&#xff0c;它可以将数据集划分为小批次&#…