算法通关村-----表达式问题

2023-09-20 20:11:00

基本计算器 II

问题描述

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。详见leetcode227

问题分析

我们可以通过栈来解决计算器的相关问题。我们可以设置一个pre变量来记录每一个数字之前的符号,当我们遇到一个数字时,查看pre变量的值,如果是+,则将该数字入栈,如果是-,则将该数字的相反数入栈,如果是*,则出栈一个元素,用出栈元素乘以当前数字,将结果压栈,如果是/,出栈一个元素,用出栈元素除以当前数字,将结果压栈,注意去除字符串中可能出现的空格,对于字符串中连续的数组成的一个数字,可以通过乘以10加当前遍历数的方式,初始时,我们可以假设pre变量为+。

代码实现

public int calculate(String s) {
    Stack<Integer> stack = new Stack<>();
    int num = 0;
    char pre = '+';
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (Character.isDigit(c)) {
            num = num * 10 + c - '0';
        }
        if (!Character.isDigit(c) && s.charAt(i) != ' ' || i == s.length() - 1) {
            if (pre == '+' || pre == '-') {
                stack.push(pre == '+' ? num : (-1) * num);
            } else {
                int x = stack.pop();
                if (pre == '*') {
                    x *= num;
                } else {
                    x /= num;
                }
                stack.push(x);
            }
            pre = c;
            num = 0;
        }
    }
    int res = 0;
    while (!stack.isEmpty()) {
        res += stack.pop();
    }
    return res;
} 

逆波兰表达式求值

问题描述

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除法总是 向零截断 。表达式中不含除零运算。输入是一个根据逆波兰表示法表示的算术表达式。答案及所有中间计算结果可以用 32 位 整数表示。详见leetcode150

问题分析

遍历字符数组,当我们遇到数字时,就将其入栈,遇到运算符时,出栈两个元素,进行运算符对应的运算,并将运算结果入栈,返回最终的栈中元素,即为运算结果。

代码实现

public int evalRPN(String[] tokens) {
    Stack<Integer> stack = new Stack<>();
    for(int i=0;i<tokens.length;i++){
        if(!Character.isDigit(tokens[i].charAt(0))&&tokens[i].length()==1){
            char c = tokens[i].charAt(0);               
            int x = stack.pop();
            int y = stack.pop();
            int res=0;
            if(c=='+'){
                res = y+x;
            }else if(c=='-'){
                res = y-x;
            }else if(c=='*'){
                res = y*x;
            }else if(c=='/'){
                res = y/x;
            }
            stack.push(res);
        }else{
            stack.push(Integer.parseInt(tokens[i]));
        }
    }
    return stack.pop();
}
更多推荐

pycharm中恢复原始界面布局_常用快捷键_常用设置

文章目录1恢复默认布局1.1直接点击file→ManageIDESettings→RestoreDefaultSettings(如下图所示):1.2直接点击RestoreandRestart,然后Pycharm就会自动重启,重启之后的界面就是最原始的界面了2改变主题2.1在PyCharm的右上角,点击“齿轮,然后点击:

ThreadPoolExecutor的使用

1.在SpringBoot项目中使用ThreadPoolExecutor:SpringBoot中可以通过创建一个配置类来定义ThreadPoolExecutor,然后在需要使用的地方直接注入即可。@ConfigurationpublicclassThreadPoolConfig{@BeanpublicExecutora

【OpenSSL】VC编译OpenSSL

VC编译OpenSSL编译工具准备编译OpenSSL建立`HelloWorld`工程创建VS工程编译工具准备安装好VisualStudio。安装Perl,主要是用来生成nmake的。准备好汇编语言编译工具nasm,并添加到path路径。下载好OpenSSL源代码。编译OpenSSL安装Perl,并加入到path路径,检

Sentinel控制台配置 持久化到nacos

sentinel控制台,使用方便,功能强大。使用官方的jar包,配置不会持久化,sentinel重启后会导致,之前的规则全部丢失,下面一起改造源码实现规则数据的持久化sentinel源码地址(github访问太慢,直接上镜像版)Sentinel:Sentinel是什么随着微服务的流行,服务和服务之间的稳定性变得越来越重

深入了解代理服务器:Socks5、IP代理与网络安全

在当今数字化时代,网络安全和数据采集对于网络工程师和爬虫开发者来说至关重要。代理服务器是一项关键技术,为保护隐私、绕过访问限制和提高网络安全提供了有力工具。本文将深入探讨几种不同类型的代理服务器,包括Socks5代理、IP代理,以及它们在网络安全和爬虫开发中的作用。1.Socks5代理:全能的代理协议Socks5代理协

什么是网络安全?网络安全包括哪几个方面?

提及网络安全,很多人都是既熟悉又陌生,所谓的熟悉就是知道网络安全可以保障网络服务不中断。那么到底什么是网络安全?网络安全包括哪几个方面?通过下文为大家介绍一下。什么是网络安全?网络安全是指网络系统的硬件、软件及系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露,系统连续可靠正常地运行,网络服务不中断

由于数字化转型对集成和扩展性的要求,定制化需求难以满足,百数低代码服务商该如何破局?

当政策、技术环境的日益成熟,数字化转型逐步成为企业发展的必选项,企业数字化转型不再是一道选择题,而是决定其生存发展的必由之路。通过数字化转型升级生产方式、管理模式和组织形式,激发内生动力,成为企业顺应时代变化,实现高质量发展的必然选择。一般来说,实现数字化转型的方式有3种:采购已有的标准系统、定制外包或者选购低代码平台

iOS17适配指南-新版

文章目录一、iOS17适配点二、具体代码一、iOS17适配点UIView与UIViewController。可以设置数据为空时的占位视图,增加SymbolAnimations,通过addSymbolEffect()与removeSymbolEffect()方法,可以实现SFSymbols图标的添加与移除动画。UIPag

通讯网关软件007——利用CommGate X2Mbt实现Modbus TCP访问MSSQL服务器

本文介绍利用CommGateX2Mbt实现ModbusTCP访问MSSQL数据库。CommGateX2MBT是宁波科安网信开发的网关软件,软件可以登录到网信智汇(wangxinzhihui.com)下载。【案例】如下图所示,实现上位机通过ModbusTCP来获取MSSQL数据库的数据。【解决方案】设置网关机,与MSSQ

【Java核心】JDK、JRE、 JVM的联系与区别

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~个人主页:.29.的博客学习社区:进去逛一逛~JDK、JRE、JVM的联系与区别1.简述2.是什么3.联系和区别1.简述简单来说:JDK是开发Java程序所需的工具包,包含了JRE,并且额外提供了开发工

Linux高性能服务器编程 学习笔记 第四章 TCP/IP通信案例:访问Internet上的Web服务器

Web客户端和服务器之间使用HTTP协议通信。我们按以下方式来部署通信实例:在Kongming20上运行wget客户端程序(一个在命令行下使用的网络下载工具,它支持通过HTTP、HTTPS和FTP协议下载文件),在ernest-laptop上运行squid代理服务器程序(主要用于缓存和转发网络请求,从而提高网络性能、安

热文推荐