手撸算法-计算表达式

2023-11-14

牛客原题

描述

请写一个整数计算器,支持加减乘三种运算和括号。

示例1

输入:
“1+2”
返回值:
3

示例2

输入:
“(2*(3-4))*5”
返回值:
-10

示例3

输入:
“3+2* 3 *4-1”
返回值:
26

思路:从左向右遍历字符串

  • 1,遇到数字则入栈,注意数字可能是多位
  • 2,遇到左括号入栈
  • 3,遇到右括号,符号栈依次出栈结合操作数栈进行计算,直到左括号出现,运算结果入栈;
  • 4,遇到运算符,判断前一个运算符和当前运算符的优先级,若前一个运算符优先级大于当前运算符优先级,前一个运算符出栈结合操作数栈进行计算,运算结果入栈;当前运算符入栈;
  • 5,字符串遍历完毕,如果运算符栈未空,则触发计算。
package leetcode2;

import java.util.ArrayDeque;
import java.util.Deque;
import java.util.HashMap;
import java.util.Map;

public class ExpressionCompute {
    public static void main(String[] args) {
        ExpressionCompute compute = new ExpressionCompute();
        System.out.println(compute.solve("100+100"));
    }

    // 关注三个点:
    // 1,入栈-左括号入栈,运算符号入栈,数字入栈
    // 2,运算触发:右括号,优先级高的运算符,字符串遍历完成后
    public int solve (String s) {
        // write code here
        Deque<Character> ops = new ArrayDeque<>();
        Deque<Integer> nums = new ArrayDeque<>();
        s = s.replaceAll(" ","");
        char[] chars = s.toCharArray();

        Map<Character,Integer> opsPri = new HashMap<>();
        opsPri.put('+',1);
        opsPri.put('-',1);
        opsPri.put('*',2);

        for (int i = 0; i < chars.length; i++) {
            char c = chars[i];
            if (c == '(') {
                // 入栈1
                ops.push(chars[i]);
            } else if (c == ')') {
                // 触发计算1
                cal(ops,nums);
            } else if (opsPri.containsKey(c)) {
                if (ops.size() > 0) {
                    char opOld = ops.peek();
                    // 触发计算2,当前运算符优先级低于或等于前一个运算符
                    if ( opOld != '(' && opsPri.get(opOld) >= opsPri.get(c)) {
                        int num2 = nums.pop();
                        int num1 = nums.pop();
                        opOld = ops.pop();
                        int newNum = cal(num1, num2, opOld);
                        nums.push(newNum);
                    }
                }
                // 入栈2
                ops.push(c);

            } else {
                // 识别数字
                int n = 0;
                int j = i;
                while(j < chars.length && Character.isDigit(chars[j])) {
                    c = chars[j];
                    n = n*10 + (c - '0');
                    j++;
                }
                // todo
                i = j-1;

                // 入栈3
                nums.push(n);
            }
        }

        // 触发计算3
        return finalCal(ops,nums);
    }

    private int finalCal(Deque<Character> ops,Deque<Integer> nums) {
        while (ops.size() > 0 && nums.size() > 0) {
            char c = ops.pop();
            int num2 = nums.pop();
            int num1 = nums.pop();
            nums.push(cal(num1, num2, c));
        }

        return nums.pop();

    }

    private void cal(Deque<Character> ops,Deque<Integer> nums) {
        char c = ops.pop();
        while (c != '(') {
            int num2 = nums.pop();
            int num1 = nums.pop();
            nums.push(cal(num1,num2,c));
            c = ops.pop();
        }
    }

    private int cal(int num1, int num2, char ops) {
        int res = 0;
        switch (ops) {
            case '+':
                res = num1 + num2;
                break;
            case '-':
                res = num1 - num2;
                break;
            case '*':
                res = num1 * num2;
                break;
            default:
                res = 0;
                break;
        }

        return res;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手撸算法-计算表达式 的相关文章

随机推荐

  • vlc web 插件 js接口

    Embed tag attributes To embed the plugin into a webpage use the following template Required ele
  • 【IEEE】2022年第六届计算机科学与智能控制国际会议(ISCSIC 2022)

    2022年第六届计算机科学与智能控制国际会议 ISCSIC 2022 重要信息 会议网址 www iscsic org 会议时间 2022年11月11 13日 召开地点 中国北京 截稿时间 2022年10月11日 录用通知 投稿后2周内 出
  • 34-变量类型

    接33节 这节举了variable的数据类型 有个例子是bool类型和其他类型相加 比如bool 浮点 由于bool类型有0和1两个值的选择 所以相加时当做0或者1 这里默认值为1 即true 再加上个浮点类型 注意的是 浮点类型的默认值启
  • UnknownHostException: api.weixin.qq.com解决方法

    在使用微信服务过程中 调用api weixin qq com 总会碰到如下这种问题 java net UnknownHostException api weixin qq com 未知的名称或服务 关键是这种问题偶尔出现 我们在测试环境甚至
  • jee中的过滤器

    对于web app的开发者来说 过滤器 是最常见不过了 在web xml中经常可以看到这样的几行
  • 【转】sed 简明教程

    awk于1977年出生 今年36岁本命年 sed比awk大2 3岁 awk就像林妹妹 sed就是宝玉哥哥了 所以 林妹妹跳了个Topless 他的哥哥sed坐不住了 也一定要出来抖一抖 sed全名叫stream editor 流编辑器 用程
  • 老生常谈-FFmpeg 的编译问题轻松搞定

    前几天发了一篇 FFmpeg 调用 Android MediaCodec 进行硬解码 关于 FFmpeg 的编译 是个老生常谈的话题了 很多初学者都会卡在怎么编译动态库 so 的问题上 这其实也是 Android 开发转音视频的一大拦路虎
  • element-ui中el-tab的的使用

    element ui中el tab的的使用 el tab在页面中当作tab页使用如下 name就是与选项卡绑定值 value 对应的标识符 表示选项卡别名 用v model绑定值 选中选项卡的 name label 设置选项卡的标题 可以动
  • Mysql的mysql_store_result/mysql_use_result,mysql_field_count/mysql_num_fields/mysql_num_rows函数区别

    Mysql的mysql store result mysql use result mysql field count mysql num fields mysql num rows函数区别 1 先参考以下文章 或者先看下面再回来理解 my
  • list.clear()与=null以及new ArrayList<E>()的差异(Map类似)

    1 使用clear 方法 List
  • linux下载命令wget命令详解

    wget是linux最常用的下载命令 一般的使用方法是 wget 空格 要下载文件的url路径 例如 wget http www linuxsense org xxxx xxx tar gz 简单说一下 c参数 这个也非常常见 可以断点续传
  • Angular自定义表单验证

    前端表单验证 为年龄输入框添加了两个验证 并分情况填写了提示语
  • Android开发 之 指纹识别

    指纹识别 在android6 0的时候谷歌对指纹识别开始支持了 现在市面的基本上指纹识别都是在api23以上的版本 涉及到一个系统服务 FingerPrintManager 在使用FingerPrintManager这个类实现的时候发现了很
  • np.meshgrid()函数

    文章目录 1 自己理解 2 官方解释 3 参数 3 1 x1 x2 xn array like 3 2 sparse bool optional 默认false 3 3 copy bool optional 1 自己理解 np meshgr
  • 用GCC开发STM32,正点原子开发板的一个库函数版本例程示例

    GCC环境搭建 首先下载交叉编译环境GCC 这个网上有很多 百度一下就能找到下载 比如 Sourcery G for ARM EABI 我的CSDN资源里 有相关下载 熟悉下Makefile 强力推荐熟悉网络牛人李云的51cto博客 有一篇
  • java 数组的长度_Java初学者:数组,得到数组长度

    得到数组的长度在java里是很简单的 那就是 数组名 length 我们来看一个简单的程序就可以了 如下 这个就是上次的那个程序 我只是把for后面那个4改成了a length 也许有人要问了 那为什么非要求出数组的长度呢 数组在起始的时候
  • Redraiment的遭遇

    描述 Redraiment的老家住在工业区 日耗电量非常大 是政府的眼中钉肉中刺 但又没办法 这里头住的可都是纳税大户呀 今年7月 又传来了不幸的消息 政府要在7 8月对该区进行拉闸限电 但迫于压力 限电制度规则不会太抠门 政府决定从7月1
  • 【CUDA】cuda安装 (windows版)

    CUDA cuda安装 windows10版 一 前言 官方教程 二 安装工具的准备 1 CUDA toolkit Download 2 cuDNN Download 三 CUDA 安装与配置过程 测试环境是否安装成功 四 cuDNN配置
  • JAVA简介

    JAVA简介 java是一种高级的面向对象的程序设计语言 使用java编写的的程序可以在任何计算机 操作系统和支持java的硬件设备上运行 什么是java java语言的发展历程 Java是于1995年由Sun公司推出的一种极富创造力的面向
  • 手撸算法-计算表达式

    牛客原题 描述 请写一个整数计算器 支持加减乘三种运算和括号 示例1 输入 1 2 返回值 3 示例2 输入 2 3 4 5 返回值 10 示例3 输入 3 2 3 4 1 返回值 26 思路 从左向右遍历字符串 1 遇到数字则入栈 注意数