力扣面试150 基本计算器 双栈模拟

news2024/9/23 15:25:46

Problem: 224. 基本计算器
在这里插入图片描述

👨‍🏫 参考题解

在这里插入图片描述

Code

class Solution {
    public int calculate(String s) {
        // 存放所有的数字,用于计算
        LinkedList<Integer> nums = new LinkedList<>();
        // 为了防止第一个数为负数,先往 nums 中加个 0
        nums.add(0);
        // 去掉表达式中的所有空格
        s = s.replaceAll(" ", "");
        // 存放所有的操作符,包括 +、-、(、)
        LinkedList<Character> ops = new LinkedList<>();
        int n = s.length(); // 获取表达式的长度
        char[] cs = s.toCharArray(); // 将字符串转换为字符数组,方便逐字符处理

        // 遍历整个表达式
        for (int i = 0; i < n; i++) {
            char c = cs[i];

            if (c == '(') {
                // 如果当前字符是左括号 '(',则将其压入 ops 栈中
                ops.add(c);
            } else if (c == ')') {
                // 如果当前字符是右括号 ')',则进行计算直到遇到左括号 '(' 为止
                while (!ops.isEmpty()) {
                    char op = ops.peekLast();
                    if (op != '(') {
                        // 计算当前的操作符
                        cal(nums, ops);
                    } else {
                        // 遇到左括号 '(',弹出并结束循环
                        ops.pollLast();
                        break;
                    }
                }
            } else {
                if (isNum(c)) {
                    // 如果当前字符是数字,则需要将整组连续的数字取出来
                    int u = 0;
                    int j = i;
                    // 将从 i 位置开始后面的连续数字整体取出,加入 nums 中
                    while (j < n && isNum(cs[j])) {
                        u = u * 10 + (int) (cs[j++] - '0');
                    }
                    nums.addLast(u);
                    // 更新 i 到数字串的最后一位
                    i = j - 1;
                } else {
                    // 如果是运算符,首先处理一元运算符的情况,例如 -(2+3)
                    if (i > 0 && (cs[i - 1] == '(' || cs[i - 1] == '+' || cs[i - 1] == '-')) {
                        // 如果当前字符前是左括号 '(' 或 '+' 或 '-',则认为是一个一元操作符,将 0 压入 nums
                        nums.addLast(0);
                    }
                    // 在添加新操作符之前,先计算掉 ops 栈中所有的前导操作符(按照顺序)
                    while (!ops.isEmpty() && ops.peekLast() != '(') {
                        cal(nums, ops);
                    }
                    // 将当前操作符加入 ops 栈
                    ops.addLast(c);
                }
            }
        }

        // 如果表达式遍历完毕,仍有操作符残留在 ops 栈中,继续进行计算
        while (!ops.isEmpty()) {
            cal(nums, ops);
        }
        
        // 最终结果是 nums 栈的最后一个值
        return nums.peekLast();
    }

    // 计算 nums 栈顶的两个数,并根据 ops 栈顶的操作符进行加减运算
    private void cal(LinkedList<Integer> nums, LinkedList<Character> ops) {
        if (nums.isEmpty() || nums.size() < 2) return;
        if (ops.isEmpty()) return;

        // 取出 nums 栈顶的两个数
        int b = nums.pollLast();
        int a = nums.pollLast();
        // 取出 ops 栈顶的操作符
        char op = ops.pollLast();

        // 根据操作符进行相应的计算
        nums.addLast(op == '+' ? a + b : a - b);
    }

    // 判断字符是否为数字
    boolean isNum(char c) {
        return Character.isDigit(c);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建stm32f103c8t6基本工程

创建stm32f103c8t6基本工程 (1)桌面空白处,鼠标右键新建文件夹,重命名为工程名字 (2)打开keil5 (3)点击Project-> New uvision project (4)找到我们桌面的刚才新建的文件夹,文件名 , 起自己的工程名字的,不要用空格 , 然后点击保存 (5)选择如下芯片, 然后确定 (6)然后就会弹…

linux的ceph

ceph ceph是一个开源的&#xff0c;用c语言编写的分布式的存储系统。存储文件数据。 分布式由多台物理磁盘组成一个集群&#xff0c;在这个基础之上实现高可用&#xff0c;扩展。 ceph是一个统一的存储系统&#xff0c;同时提供块设备存储&#xff0c;文件系统存储和对象存储…

C++学习笔记05-补充知识点(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文对读者可以用作自查&#xff0c;答案在后面&#xff0…

55 华三模拟器Server2 操作

华三模拟器Server2 操作 # /etc/config/dhcp uci set dhcp.eth2dhcp uci set dhcp.eth2.interfaceeth2 uci set dhcp.eth2.start100 uci set dhcp.eth2.limit150 uci set dhcp.eth2.leasetime12h # /etc/config/network uci set network.eth2interface uci set network.eth2.pr…

可爱萌《奥咕和秘密森林》,电脑单机游戏免费分享

《奥咕和秘密森林》是一款2D冒险游戏&#xff0c;游戏中玩家将与奥咕宝宝一起探索一个奇妙的世界。这款游戏的特点包括手绘角色和多种谜题&#xff0c;玩家可以在游戏中与激萌的小动物成为朋友&#xff0c;打败异界怪物&#xff0c;揭开未知世界的秘密。 游戏特色 探索世界&am…

宁德时代社招SHL入职测评:语言理解数字推理测评及综合测评真题、高分攻略、答题技巧

宁德时代的社招入职测评主要采用SHL的Verify系统&#xff0c;测评内容包括语言理解、数字推理、逻辑推理等部分。具体来说&#xff0c;语言理解部分包括阅读理解、逻辑填空和语句排序等题型&#xff0c;要求在限定时间内完成一定数量的题目 。数字推理部分则包括数字序列、数学…

JavaScript 数组排序

JavaScript 提供了多种对数组进行排序的方法&#xff0c;其中最常见和直接的是使用数组的 .sort() 方法。.sort() 方法可以对数组的元素进行排序&#xff0c;并返回排序后的数组。然而&#xff0c;.sort() 方法默认将数组元素转换为字符串&#xff0c;并按照字符串的 Unicode 编…

【Python】数据类型之字典(上)

字典是有序、键不重复且元素只能是键值对的可变的一个容器。 data{"k1":1,"k2":25} data中“k1”和“k2”是键&#xff0c;而1,25是值。“k1”:1,"k2":25是键值对。 1&#xff09;&#xff09;容器&#xff1a;存储多个元素。 2&#xff09;…

2024年港澳台联考高校新一波录取分数线来啦

导读 在前面几次中&#xff0c;我们和大家分享了一些2024年港澳台联考高校最新的录取分数线。今天我们继续来看一批新的录取分数线吧&#xff01;景于行分享的数据基本上都是经过可靠验证的&#xff0c;大家可以放心参考。 上海大学 上海大学和深圳大学是近些年来&#xff0c;依…

haproxy的安装和服务信息

为什么要使用haproxy&#xff1f; 因为LSV无后端检测&#xff0c;当webserver有一台状态异常&#xff0c;则运作异常&#xff1b;所以用haproxy来解决。 haproxy是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器&#xff0c;它支持基于cookie的持久性&#xff0c;自动…

力扣-1两数之和2两数相加-2024/8/3

1、两数之和 解法一 暴力法&#xff08;2个for循环&#xff09; class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:for ii in range(len(nums)):for jj in range(ii1, len(nums)):if nums[ii]nums[jj] target:return [ii,jj]解法二 哈希表法…

具有并发功能的网页以及一点链表相关内容

最近学习内容&#xff0c;前几天做了个小项目&#xff0c;通过tcp与html构建具有并发功能的商城 具有以下功能&#xff1a; 1 登陆进入查询页面 2 搜索商品信息概述 3 查看商品详细信息 4 记录访客信息 5 注册新用户 主页如下 主页程序 程序的设计&#xff1a;将现实中大…

DELL EMC PowerStore1000T存储添加主机、映射LUN

本次操作是为了把存储的卷映射给VMware集群&#xff0c;存储网络协议为FC SAN&#xff0c;存储端和主机端均连接FC交换机&#xff0c;并且FC交换机已完成ZONE相关配置 具体操作过程如下&#xff1a; 一、DELL EMC PowerStore1000T添加主机 1、进入Web控制台&#xff0c;点击…

字符函数和字符串函数(C语言)

目录 一. 字符分类函数 二. 字符转换函数 三.多种函数的使用和模拟实现 3.1 strlen函数 3.2 strcpy函数 3.3 strcat函数 3.4 strcmp函数 3.5 strncpy strncat strncmp &#x1f35f;&#x1f9e3;结束了指针的学习&#xff0c;我们开始了字符串之旅&#xf…

【若依项目-RuoYi】掌握若依前端的基本流程

搞毕设项目&#xff0c;使用前后端分离技术&#xff0c;后端springBoot&#xff0c;前端vue3element plus。自己已经写好前端与后端代码&#xff0c;但想换一个前端界面所以使用到了若依&#xff0c;前前后后遇到许多坑&#xff0c;记录一下&#xff0c;方便之后能够快速回忆。…

创意指南丨VR游览沉浸式空间体验

欢迎来到我们制作的VR幻想世界。玩家的起点是一条蓝色水晶大道&#xff0c;让我们一起探索这个如梦似幻的境地。 在这条大道的两侧&#xff0c;漂浮着半透明的大水晶水母。它们轻盈地在空中飘动&#xff0c;仿佛在欢迎我们的到来。这条道路上方&#xff0c;一个个半圆环不停地…

人脸身份证比对接口如何用Java对接?(二)

一、什么是人脸身份证比对&#xff1f; 人脸身份证比对又称人证比对&#xff0c;实人比对&#xff0c;人像比对&#xff0c;输入姓名、身份证号码和头像照片&#xff0c;与公安库身份证头像进行权威比对&#xff0c;返回分值作为判断依据。 二、人脸身份证比对接口适用哪些场…

iMovie Tutorial【iMovie 剪辑教程】

文章目录 项目字幕视频截取范围 显示进度条大小播放速度视频图层降噪转场设置转场时间 声音录制声音 分享导出文件 项目 字幕 视频 截取范围 i、o、e 显示进度条大小 播放速度 视频图层 例如&#xff1a;视频衔接、插入表情视频、头像对话 降噪 户外录制视频需要降噪。…

计算机学习

不要只盯着计算机语言学习&#xff0c;你现在已经学习了C语言和Java&#xff0c;暑假又规划学习Python&#xff0c;最后你掌握的就是计算机语言包而已。 2. 建议你找一门想要深挖的语言&#xff0c;沿着这个方向继续往后学习知识就行。计算机语言是学不完的&#xff0c;而未来就…

在ccs theia上用jlink下载烧录调试msp芯片配置

转载自ti官网的文章结合我自己的经历 将 Segger 编程器与 MSPM0 配合使用 1. 引言 本指南说明了如何将 Segger 编程器与 MSPM0 配合使用。 本文档不用于详细说明如何使用 Segger 工具。有关详细文档&#xff0c;请参阅相应的 IDE 或 Segger 文档。 2. 先决条件 用户应已下…