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

力扣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 \leq s.length \leq 3 \times 10^5 )
  • s由数字、‘+’、‘-’、‘(’、‘)’、和空格组成
  • s表示一个有效的表达式
  • '+'不能用作一元运算(例如,“+1"和”+(2+3)"无效)
  • '-'可以用作一元运算(即"-1"和"-(2+3)"是有效的)
  • 输入中不存在两个连续的操作符
  • 每个数字和运行的计算将适合于一个有符号的 32位整数
class Solution {
    public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        stack.push(1);
        int v = 1;
        int ans = 0;
        int i = 0;
        while (i < s.length()) {
            char c = s.charAt(i);
            // 只处理非空格
            if (c != ' ') {
                if (c == '+') {
                    v = stack.peek();
                } else if (c == '-') {
                    v = -stack.peek();
                } else if (c == '(') {
                    stack.push(v);
                } else if (c == ')') {
                    stack.pop();
                } else {
                    int num = 0;
                    while (i < s.length() && Character.isDigit(s.charAt(i))) {
                        num = num * 10 + s.charAt(i) - '0';
                        i++;
                    }
                    ans = ans + v * num;
                    continue;
                }
            }
            i++;
        }
        return ans;
    }
}

解题思路:这道题的官方题解写得比较绕,虽然是使用栈的方法解题,但是并不需要将具体需要计算的数字压入栈中。栈只对加减号±操作,使用栈结构将所有的括号去除,例如-(1-(2-(3-4)))其实可以化简为-1+2-3+4此时直接扫描计算即可,每当遇到正负号和左右括号时都需要对栈做相关的处理,遇到+时当前位置真正的运算符号和栈顶符号相同,-时相反。遇到时将符号压入栈中,时出栈。


http://www.kler.cn/a/321788.html

相关文章:

  • 【安全科普】NUMA防火墙诞生记
  • WebLogic 介绍
  • JVM详解:类的加载过程
  • 4-6-2.C# 数据容器 - ArrayList 扩展(ArrayList 注意事项、ArrayList 存储对象的特性、ArrayList 与数组的转换)
  • JavaSecLab靶场搭建
  • Ubuntu配置阿里云docker apt源
  • 22 vue3之全局函数和变量插件编写
  • Flask中创建多线程和多进程
  • 黑龙江等保托管:全面解析与实践指南
  • IOS-IPA签名工具 request_post 任意文件读取复现
  • Stable Diffusion 使用详解(13)--- 3D纹理增强
  • C#邮件发送:实现自动化邮件通知完整指南!
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL62
  • 软考高级:敏捷开发 SCRUM
  • 后端Java-SpringBoot整合MyBatisPlus步骤(超详细)
  • LabVIEW界面输入值设为默认值
  • 基于SSM+小程序的英语学习交流平台管理系统(学习3)(源码+sql脚本+视频导入教程+文档)
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【用户态内存调测】
  • RabbitMQ下载安装运行环境搭建
  • zTasker自动化任务的小工具
  • Sql Server时间转换之查询时间格式不对--CONVERT(NVARCHAR,CreateTime,23) 转换出来有时分秒
  • React Native、Uni-app、Flutter优缺点对比
  • 【个人笔记】线程和线程池的状态以及转换方式
  • html,js,react三种方法编写helloworld理解virtual dom
  • 【重学 MySQL】三十九、Having 的使用
  • 地平线静态目标检测 MapTR 参考算法-V1.0