前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >227. 基本计算器 II

227. 基本计算器 II

作者头像
张伦聪zhangluncong
发布于 2022-10-26 10:18:55
发布于 2022-10-26 10:18:55
31400
代码可运行
举报
运行总次数:0
代码可运行

实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。

示例 1:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: "3+2*2"
输出: 7

示例 2:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: " 3/2 "
输出: 1

示例 3:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入: " 3+5 / 2 "
输出: 5

说明:

  • 你可以假设所给定的表达式都是有效的。
  • 请不要使用内置的库函数 eval。

解:很经典,带括弧的整数加减乘除计算器实现,纯手打。计算器算法分两步:

  • 中缀表达式转后缀表达式(逆波兰表达式) 1.设立一个只保存运算符和(的符号栈signStack,与优先级map,如下代码 2.遍历中缀表达式,遇到数字直接输出;遇到(直接入栈;遇到+-*/先判断栈顶是否有优先级大于等于它的元素,有就把这些栈顶元素出栈输出后它入栈,没有就直接入栈;遇到)把栈顶元素出栈输出,直到碰见((出栈不输出;注意:输出的意思指的是保存到后缀表达式列表hzList中。
  • 后缀表达式计算 1.设立一个只保存数字的数字栈digitStack,如下代码 2.遍历后缀表达式,遇到数字直接入栈;遇到+-*/出栈两个元素进行对应符号计算;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
    public int calculate(String s) {
        //整数计算器
        //去掉所有空格
        s = s.replaceAll(" ", "");
        //中缀转后缀表达式,假定s只有数字()+-*/不含其它字符===========start
        List<String> hzList = new ArrayList<>();
        //运算符优先级,值大的优先计算
        Map<Character, Integer> map = new HashMap<>();
        map.put('+', 1);
        map.put('-', 1);
        map.put('*', 2);
        map.put('/', 2);
        //保存运算符栈
        Stack<Character> signStack = new Stack<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            //是否为数字
            boolean isDigit = Character.isDigit(c);
            if (isDigit) {//如果为数字直接输出
                int tmp = i;
                while ((i + 1) < s.length() && Character.isDigit(s.charAt(i + 1))) {
                    i++;
                }
                hzList.add(s.substring(tmp, i + 1));
            } else if (c == '(') {//如果是左括弧直接入栈
                signStack.push(c);
            } else if (c == ')') {//如果是右括弧直接出栈输出,直到出现左括弧,(不输出
                while (signStack.peek() != '(') {
                    hzList.add(String.valueOf(signStack.pop()));
                }
                //去掉栈顶的(
                signStack.pop();
            } else {//均为+-*/运算符
                while (!signStack.isEmpty() && signStack.peek() != '(' && map.get(signStack.peek()) >= map.get(c)) {//如果栈中运算符优先级大于大于它,那么出栈输出
                    hzList.add(String.valueOf(signStack.pop()));
                }
                //最后自己入栈
                signStack.push(c);
            }
        }
        //栈中还存留符号出栈输出
        while (!signStack.isEmpty()) {
            hzList.add(String.valueOf(signStack.pop()));
        }
        //中缀转后缀表达式,假定s只有数字()+-*/不含其它字符===========end

        //计算后缀表达式成最终结果
        Stack<String> digitStack = new Stack<>();
        for (String str : hzList) {
            if (isNumeric(str)) {
                digitStack.push(str);
            } else if ("+".equals(str)) {
                int a = Integer.valueOf(digitStack.pop());
                int b = Integer.valueOf(digitStack.pop());
                digitStack.push(String.valueOf(b + a));
            } else if ("-".equals(str)) {
                int a = Integer.valueOf(digitStack.pop());
                int b = Integer.valueOf(digitStack.pop());
                digitStack.push(String.valueOf(b - a));
            } else if ("*".equals(str)) {
                int a = Integer.valueOf(digitStack.pop());
                int b = Integer.valueOf(digitStack.pop());
                digitStack.push(String.valueOf(b * a));
            } else if ("/".equals(str)) {
                int a = Integer.valueOf(digitStack.pop());
                int b = Integer.valueOf(digitStack.pop());
                digitStack.push(String.valueOf(b / a));
            }
        }
        return Integer.valueOf(digitStack.pop());
    }

    private boolean isNumeric(String str) {
        for (int i = str.length(); --i >= 0; ) {
            if (!Character.isDigit(str.charAt(i))) {
                return false;
            }
        }
        return true;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Java】开发工具IntelliJ IDEA
IDEA 是一个专门针对 Java 的集成开发工具 (IDE) ,由 Java 语言编写。所以,需要有 JRE 运行环境并
陶然同学
2023/02/27
9840
【Java】开发工具IntelliJ IDEA
Java基础-开发工具IntelliJ IDEA
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/27
9230
IntelliJ IDEA:JAVA开发人员的终极IDE-安装和使用教程
开始之前推荐一篇实用的文章:《多智能体强化学习在自动驾驶中的协作与优化探讨》,作者:【申公豹】。
Lion Long
2024/12/07
3800
IntelliJ IDEA:JAVA开发人员的终极IDE-安装和使用教程
【Kotlin】IntelliJ IDEA 创建 Kotlin 项目
1 . 创建工程 : 首界面 选择 Create New Project 选项, 即 弹出工程创建对话框;
韩曙亮
2023/03/27
1.9K0
【Kotlin】IntelliJ IDEA 创建 Kotlin 项目
2022 最新 IntelliJ IDEA 2022 详细配置步骤演示(图文版)
作为一名开发人员,第一肯定是选择一款趁手的开发利器,本人使用 Java 偏多,这里推荐使用 IntelliJ IDEA, 俗称神级开发工具,具体的安装过程就不过多赘述了,有需要了解的朋友可以参考博文:
猫头虎
2024/04/07
4570
2022 最新 IntelliJ IDEA 2022 详细配置步骤演示(图文版)
2023 最新 IntelliJ IDEA 2023.3 详细配置步骤演示(图文版)<中文版>
作为一名开发人员,第一肯定是选择一款趁手的开发利器,本人使用 Java 偏多,这里推荐使用 IntelliJ IDEA, 俗称神级开发工具,具体的安装过程就不过多赘述了,有需要了解的朋友可以参考博文:
猫头虎
2024/04/07
3.4K0
2023 最新 IntelliJ IDEA 2023.3 详细配置步骤演示(图文版)<中文版>
【Visual Studio 2019】创建 导入 CMake 项目
打开 Visual Studio , 点击右侧的 " 创建新项目 ( N ) " 选项 ;
韩曙亮
2023/03/27
2.8K0
【Visual Studio 2019】创建 导入 CMake 项目
eclipse怎么导入java文件_Eclipse如何导入JAVA工程?如何将项目导入Eclipse中?
Eclipse如何导入JAVA工程?很多用户在学习Eclipse的过程中都会不小心把项目给删除了,到这里,笔者要先说一下“没关系,先不要慌张”,如果你把项目删除了,是可以通过导入的方法找回来的。具体方法见下文。
全栈程序员站长
2022/09/08
2.8K0
【IntelliJ IDEA】导出可执行 JAR 包
选择 " 菜单栏 / File / New / Project " 选项 , 创建新应用 ,
韩曙亮
2023/03/29
4K0
【IntelliJ IDEA】导出可执行 JAR 包
IntelliJ IDEA 2021.2 中,您完全不需要鼠标的 10 种情况
在 IntelliJ IDEA 上,您是不是更喜欢使用键盘而不是鼠标?如果答案是肯定的,那接下来的内容正好适合您!在这篇文章中,我们将向您展示 10 个不必在日常任务中使用鼠标的位置。
猫头虎
2024/04/07
2460
IntelliJ IDEA 2021.2 中,您完全不需要鼠标的 10 种情况
IntelliJ IDEA中新建JAVA WEB项目、maven项目
1、 在主界面顶部菜单栏依次“File”-"New"-"Project..."
微风-- 轻许--
2022/04/13
5590
IntelliJ IDEA中新建JAVA WEB项目、maven项目
idea中导入maven项目
我们项目组所开发的项目没有做前后端分离,所有开发人员都在同一个项目下编写代码,项目的前端使用jQuery+Layui+GoJS+echarts实现,后端使用的是SSH,因为没做前后端分离再加上后端开发用了maven构建代码,所以每个开发人员的开发工具都是idea,刚接触项目时,因为我是做前端开发,对后端不熟,每次搭建开发环境的时候都要叫后端开发的同事帮忙,经过不断摸索,我现在差不多也能自己独立完成开发环境的配置。
用户3880999
2023/04/13
1.4K0
idea中导入maven项目
【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637
韩曙亮
2023/03/27
1.1K0
【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )
参考 【IntelliJ IDEA】导出可执行 JAR 包 博客 , 导出可执行 JAR 包 ;
韩曙亮
2023/03/29
8620
【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )
安装IntelliJ IDEA详细说明
以上是在Windows操作系统上安装和配置IntelliJ IDEA的详细步骤。在安装和使用过程中,如果遇到问题或困难,可以参考IntelliJ IDEA的官方文档或社区论坛,或向相关社区提问求助。
编程技术馆
2023/03/12
5240
安装IntelliJ IDEA详细说明
【错误记录】IntelliJ IDEA 编译 Java 文件报错 ( 错误: 非法字符: ‘\ufeff‘ )
出现该问题的原因是 IntelliJ IDEA 在创建文件时 , 为文件添加了 BOM 隐藏字符 , 这是 文件的 字节顺序标记 , 一般在 Windows 中的文件中添加 ;
韩曙亮
2023/03/30
1.8K0
【错误记录】IntelliJ IDEA 编译 Java 文件报错 ( 错误: 非法字符: ‘\ufeff‘ )
在IntelliJ IDEA开发工具中配置git和github
主要讲解4个知识点: (1)安装git客户端(windows版本); (2)在IDEA中配置Git; (3)在IDEA中配置Github; (4)从Github上下载项目导入到IDEA; 下面是录制的视频课程,视频时长为8分钟,建议在wifi环境下观看: 不方便观看视频的网友,也可以阅读下面的图文教程: 安装git Git是目前比较流行的一个版本管理工具(以前使用SVN作为版本控制工具),在企业开发中使用非常普遍,IntelliJ IDEA也对集成Git客户端提供了很好的支持,在IDEA中配置Git之前,首
企鹅号小编
2018/01/11
6.4K0
在IntelliJ IDEA开发工具中配置git和github
IntelliJ IDEA 2018.3 重大升级(转)
2018.11.28 IntelliJ IDEA 2018.3 正式版发布。对于一个忠实爱好者,迫不及待的我下载了最新版本来体验下。而且 IDEA 今年的第三次重大更新提供了不容错过的显著功能!你可以访问详细概述的新内容 What's New,或直接访问网站并立即下载 IntelliJ IDEA的全新版本。
二十三年蝉
2018/12/20
1.8K0
在IDEA中创建、运行第一个Java项目
  本文介绍在IntelliJ IDEA软件中,新建项目或打开已有项目,并撰写Java代码的具体方法;Groovy等语言的代码也可以基于这种方法来撰写。
疯狂学习GIS
2024/10/25
6240
在IDEA中创建、运行第一个Java项目
IntelliJ IDEA 配置教程,教你彻底学会去安装它
IntelliJ IDEA 是由 JetBrains 开发的一款强大、智能的集成开发环境(IDE),特别适用于 Java 开发。它提供了丰富的功能和工具来支持各种编程语言和框架。本文将详细介绍如何配置 IntelliJ IDEA,以便您能够充分利用其功能进行高效的开发工作。
E绵绵
2024/06/23
6840
推荐阅读
相关推荐
【Java】开发工具IntelliJ IDEA
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验