LeetCode 150. 逆波兰表达式求值

作者:Best_Jerry日期:2026/7/13

leetcode.cn/problems/ev…

programmercarl.com/0150.%E9%80…

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*''/'
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

示例 1:

1输入: tokens = ["2","1","+","3","*"]
2输出: 9
3解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
4

示例 2:

1输入: tokens = ["4","13","5","/","+"]
2输出: 6
3解释: 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
4

示例 3:

1输入: tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
2输出: 22
3解释: 该算式转化为常见的中缀算术表达式为:
4  ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
5= ((10 * (6 / (12 * -11))) + 17) + 5
6= ((10 * (6 / -132)) + 17) + 5
7= ((10 * 0) + 17) + 5
8= (0 + 17) + 5
9= 17 + 5
10= 22
11

提示:

  • 1 <= tokens.length <= 104
  • tokens[i] 是一个算符("+""-""*""/"),或是在范围 [-200, 200] 内的一个整数

逆波兰表达式:

逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

  • 平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )
  • 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * )

逆波兰表达式主要有以下两个优点:

  • 去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
  • 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

其实逆波兰表达式相当于是二叉树中的后序遍历。 大家可以把运算符作为中间节点,按照后序遍历的规则画出一个二叉树。

但我们没有必要从二叉树的角度去解决这个问题,只要知道逆波兰表达式是用后序遍历的方式把二叉树序列化了,就可以了。

在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项 (opens new window)中的对对碰游戏是不是就非常像了。

如动画所示:

相信看完动画大家应该知道,这和1047. 删除字符串中的所有相邻重复项 (opens new window)是差不多的,只不过本题不要相邻元素做消除了,而是做运算!

1class Solution {
2    fun evalRPN(tokens: Array<String>): Int {
3        val result: Int
4        val stack = Stack<Int>()
5        var tempNum: Int
6        for ((index, string) in tokens.withIndex()) {
7            if (string == "+" || string == "-" || string == "*" || string == "/") {
8                val num2 = stack.pop()
9                val num1 = stack.pop()
10                if (string == "+") {
11                    tempNum = num1 + num2
12                    stack.push(tempNum)
13                } else if (string == "-") {
14                    tempNum = num1 - num2
15                    stack.push(tempNum)
16                } else if (string == "*") {
17                    tempNum = num1 * num2
18                    stack.push(tempNum)
19                } else if (string == "/") {
20                    tempNum = num1 / num2
21                    stack.push(tempNum)
22                }
23            } else {
24                stack.push(string.toInt())
25            }
26        }
27        return stack.pop()
28    }
29}
30

LeetCode 150. 逆波兰表达式求值》 是转载文章,点击查看原文


相关推荐


【系统架构设计师】论文篇
忻州人在郑州2026/7/5

文章目录 前言总体方向浅谈论文要求及准备方法如何找项目具体论文各部分准备通用摘要模板通用项目背景与本人职责通用点题句中间段1. 论微服务架构及其应用2. 论云原生架构及其应用3. 论大数据架构及其应用4. 论系统架构评估5. 论软件测试方法及应用6. 论需求分析方法及应用7. 论软件开发模型及应用8. 负载均衡9. 事件驱动架构 万能句1. 需求与变更控制2. 敏捷开发3. 测试保障4. 运维治理 通用结尾 参考资料 前言 ​ 本系列文章为软考系统架构设计师笔记


Flutter版本选择指南:3.44系列继续观望 | 2026年6月
程序员老刘2026/6/27

大家好,我是老刘 每次Flutter发新版本,群里总有人问:"老刘,3.44.3出来了,我能升了吗?" 我的回答永远不变:再等等。 不是我不信任Google的修复速度。事实上,3.44系列这一个月发三个补丁,节奏还算克制。但是,补丁版本的稳定不等于生产环境的可靠,尤其是3.44这一版动了SwiftPM和Android底层架构,第三方插件的适配进度至今没有一个明确的说法。 今天这篇,我把6月所有版本状态、修复内容和选择策略一次性讲清楚,帮你做出不后悔的决定。 一、6月Flutter大事件 Flu


PyCharm 中调用项目内文件夹的 Python 文件方法
6v6-博客网2026/6/18

PyCharm 中调用项目内文件夹的 Python 文件方法 在 PyCharm 中调用另一个文件夹中的 .py 文件,本质上是解决 Python 的模块导入路径问题。默认情况下,Python 只会搜索当前目录和系统库,直接导入子文件夹里的模块会报 ModuleNotFoundError。以下提供三种最有效的解决方案。 方法一:将文件夹标记为「源根」(最推荐) 这是 PyCharm 独有的便捷功能,无需修改代码即可让 IDE 识别路径。 在项目侧边栏中,右键点击目标文件夹(比如 utils)。选


workbuddy ,node.js 每次会在 项目目录上安装 node_modules,能不能一次安装多次使用,为什么 npm 不把包装在全局
zhangfeng11332026/6/10

workbuddy ,node.js 每次会在 项目目录上安装 \node_modules ,而不是把他放到node.js的安装目录 或者系统的path 中导致 ,类似的功能 都要载入 安装 程序包 很慢 你的问题核心是:npm 默认把包安装在项目本地 node_modules,每次新建项目都要重新 npm install,耗时且冗余。这是 npm 的设计哲学问题,我来解释清楚并提供解决方案。 为什么 npm 不把包装在全局? npm 的设计原则是 依赖隔离: 方式优点缺点项目本地安装(


数据同步的几种姿势
小跟班_mya2026/6/3

先搞清楚一件事:为什么要有 ES 数据同步? 想象一下,你开了一家图书馆: MySQL 是图书管理员,负责把书一本本摆好、登记在册(增删改查、事务保证)Elasticsearch 是图书检索系统,用户输入"三体",0.01 秒就能告诉你第几排第几架(全文检索、聚合分析) 问题来了:管理员刚上架了一本新书,检索系统怎么立刻知道这本书的存在?这就是数据同步要解决的事。 方案一:同步双写——"一边记账一边贴标签" 场景 你开了个电商网站,用户下单后,订单既要存到 MySQL(方便财务对账


Vibe Coding 全栈实战:章鱼哥解题 07|功能跑通后的架构收敛
小小小小小鹿2026/5/28

Vibe Coding 全栈实战:章鱼哥解题 07|功能跑通后的架构收敛 上一期做完对话持久化以后,章鱼哥已经不只是一个“能回答问题”的接口了。它有了登录态,有了当前对话,有了 LangGraph thread,也能在刷新页面后恢复最近的消息。 但功能跑通以后,我回头看了一下后端模块依赖,发现了两个不太舒服的地方。 一个是 agent 依赖了 chat: agent.nodes → chat.question_classifier 另一个是 infra.llm 依赖了 rag.context_


开发了一个管理本地开发环境的软件
神奇的程序员2026/5/5

前言 前阵子换了新电脑,我在整理本地开发环境时,看到一堆需要重新装的,顿时感觉好麻烦。想着都过去这么久了,应该有工具可以做到统一管理,实现快速安装、更新、切换版本吧。 经过一番查找后,找到了mise这个东西,只需要简单的一句命令就能安装java、node、redis、go等工具,而且还支持对这些工具做统一管理(更新、删除),支持三大主流平台(macOS/Windows/Linux) 命令行始终不方便,于是我萌生了一个做GUI的想法,花了亿点时间用Flutter把它开发出来了,欢迎各位有需要的开发


Hello 算法:“走一步看一步”的智慧
灵感__idea2026/4/26

每个系列一本前端好书,帮你轻松学重点。 本系列来自上海交通大学硕士,华为高级算法工程师 靳宇栋 的 《Hello,算法》 “走一步看一步”,是我们面对不断变化的世界所采取的应对策略。 多数时候,我们无法对未来做出准确预测,只能根据上一件事的结果对下一件事做决策。介绍“分治”的时候,我们已经接触过这种策略。本篇主角依然如此,但又有所不同。 先看个例子。 爬楼梯 给一个 n 阶楼梯,每步可以上 1 阶或者 2 阶,问有多少种方案可以爬到楼顶? 假设 n 是3,那么方案共 3 种。如下图所示。 这


Linux 驱动开发入门:从最简单的 hello 驱动到硬件交互
4. 嵌入式铲屎官2026/4/17

Linux 驱动开发入门:从最简单的 hello 驱动到硬件交互 🎉 写给未来的自己和领导:本文是 Linux 驱动开发的 入门级保姆教程,从零开始搭建驱动框架,逐行解释代码,记录每一个踩过的坑。无论你是刚接触内核编程,还是想快速上手 GPIO 中断,都能在这里找到清晰的思路和可复现的步骤。 📚 目录 引言:驱动是什么?驱动的基本框架 —— 一切皆文件实战:第一个 hello 驱动 3.1 完整的驱动源码(带详细注释)3.2 编译驱动 —— Makefile 解析3.3 上机测试 ——


深入剖析 Redis 经典面试题
Thomas.Sir2026/4/9

1、什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读