首页 > 其他分享 >224.基本计算器

224.基本计算器

时间:2023-11-06 17:01:16浏览次数:42  
标签:基本 idx get list else 计算器 224 stack sign

224. 基本计算器

题目描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

注意:不允许使用任何将字符串作为数学表达式计算的内置函数,

比如 eval()

示例 1:

输入:s = "1 + 1"

输出:2

示例 2:

输入:s = " 2-1 + 2 "

输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"

输出:23

提示:

224.基本计算器_List

s数字、'+'、'-'、'('、')'、和 ' ' 组成

s 表示一个有效的表达式

'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)

'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)

输入中不存在两个连续的操作符

每个数字和运行的计算将适合于一个有符号的 32位 整数

题目解析

  • 首先,空格的处理需要被跳过
  • 遇到右括号的时候计算括号内的值,然后压入栈中
  • 最终栈里面没有括号,计算最终结果值

show code

class Solution {
    public int calculate(String s) {
        int n = s.length();

        // 创建一个栈
        Stack<String> stack = new Stack<>();

        int idx = 0;
        while(idx < n) {
            char at = s.charAt(idx);
            // 判断 at
            if(Character.isDigit(at)) {
                // 是数字,把数字压入栈中.
                int start = idx;
                while(start < n && Character.isDigit(s.charAt(start))) {
                    start++;
                }
                String localNum = s.substring(idx, start);
                stack.push(localNum);
                idx = start;
            } else if (at == '+' || at == '-') {
                // 是符号,符号压入栈中
                stack.push(String.valueOf(at));
                idx++;
            } else if(at == '(') {
                //左括号压入栈中.
                stack.push(String.valueOf(at));
                idx++;
            } else if(at == ')') {
                //  去栈里面去找  左括号 '('
                List<String> list = new ArrayList<>();
                //  把 找到的元素加入到  list 集合中去
                while(!stack.isEmpty() && !stack.peek().equals("(")) {
                    list.add(stack.pop());
                }
                // 这里取出左括号
                stack.pop();

                // 这里时候计算 list
                long init = 0;
                char sign = '+';
                for (int i = list.size() - 1; i >= 0;i--) {
                    if("-".equals(list.get(i))) {
                        sign = '-';
                    } else if("+".equals(list.get(i))) {
                        sign = '+';
                    } else {
                        if(sign == '+') {
                            init += Long.parseLong(list.get(i));
                        } else {
                            init -= Long.parseLong(list.get(i));
                        }
                    }
                }

                // 计算结果压入栈中
                stack.push(String.valueOf(init));
                idx++;
            } else {
                // 如果遇到空格,则跳过.
                idx++;
            }
        }

        // 计算结果值
        List<String> list = new ArrayList<>();
        char sign = '+';
        long init = 0;
        while(!stack.isEmpty()) {
            list.add(stack.pop());
        }

        for(int i = list.size() - 1;i >= 0;i--) {
            if("-".equals(list.get(i))) {
                sign = '-';
            } else if("+".equals(list.get(i))) {
                sign = '+';
            } else {
                if(sign == '+') {
                    init += Long.parseLong(list.get(i));
                } else {
                    init -= Long.parseLong(list.get(i));
                }
            }
        }

        return (int) init;
    }
}

标签:基本,idx,get,list,else,计算器,224,stack,sign
From: https://blog.51cto.com/u_16079703/8214512

相关文章

  • Newtonsoft.Json基本用法
    序列化和反序列化JSONJsonConvert对于想要与JSON字符串相互转换的简单场景,JsonConvert上的SerializeObject ()和 DeserializeObject () 方法在JsonSerializer上提供了易于使用的包装器。下面代码使用序列化与反序列化:1classProduct2{3[JsonIgnore]4......
  • Metasploit渗透测试框架的基本使用
    一、Metasploit渗透测试框架介绍(1)基础库metasploit基础库文件位于源码根目录路径下的libraries目录中,包括Rex,framework-core和framework-base三部分。Rex是整个框架所依赖的最基础的一些组件,如包装的网络套接字、网络应用协议客户端与服务端实现、日志子系统、渗透攻击支持例......
  • 搜索文档树,bs4其它用法,css选择器,selenium基本使用,selenium其它用法
    1搜索文档树......
  • Centos 基本命令
    vim的使用:yuminstallvim-yx保存退出q退出,不保存q!强制退出,不保存w保存,但没退出wq保存并退出wq!强制保存并退出配置网卡:vim/etc/sysconfig/network-scripts/ifcfg-ens33(以实际网卡为准,可以用Tab补全)#编辑网卡配置文件TYPE=Ethernet#网卡类......
  • 数据结构的基本概念和术语
    数据(Data)数据:能输入计算机且能被计算机处理的各种符号的集合,信息的载体能被计算机识别,存储和加工包括:数值型的数据:整数,实数等  非数值型的数据:文字,图像,声音等;2.数据元素和数据项数据元素:是数据的基本单位,在计算机程序......
  • java 基本数据类型和引用数据类型02
    ......
  • kali官方在线应用商店的基本常识
    所谓的kali官方在线应用商店,专业术语是软件仓库,只是为更加直白的表述。包含已经kali为我们编译好的一堆基本软件和渗透专用软件,大约有6万个。地址是http://http.kali.org/kali/。细分为5个硬件平台,11个分支,3个目录,4个组件 架构i386:也称为x86或x86-32,是Intel和AMD等公司推......
  • Anaconda - anaconda基本使用
    学习链接:Anaconda新手使用教程_anaconda使用教程_三烽的博客-CSDN博客anaconda基本使用:下载安装后(有什么选项就全部勾上)然后打开anacondaprompt命令行输入path看看有没有配置环境变量,一般都会输出然后输入activate-nnamepythnotallow=版本号,回车执行下载好后输入activatename......
  • linux shell中 创建数组及数组的基本操作
     001、创建数组a、方法1[root@pc1test01]#ay1=(100200"abc""xyz")##创建数组 b、方法2[root@pc1test01]#ay2[0]=100[root@pc1test01]#ay2[1]=200[root@pc1test01]#ay2[3]="mn" 002、访问数组的全部元素[root@pc1test01]#ay1=(100......
  • Task基本用法
     什么是异步同步和异步主要用于修饰方法。当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,这个为异步方法。当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务,调用者不用等待该方法执行完毕,我们称为这个方法为异步方法。 《IllustratedC#7F......