当前位置: 首页 > news >正文

算法打卡第二十天|LeetCode 150. 逆波兰表达式求值|栈的经典应用

算法打卡第二十天|LeetCode 150. 逆波兰表达式求值|栈的经典应用

今天是算法打卡第20天,我学习了LeetCode 150. 逆波兰表达式求值这道题,作为栈的又一经典应用题,它的解题思路很巧妙,第一次接触很难直接想到解法,跟着视频讲解梳理逻辑后,彻底理解了栈在表达式计算中的核心作用,下面分享我的完整学习笔记。

题目回顾

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/

题目描述

给你一个字符串数组 tokens ,表示一个根据逆波兰表示法表示的算术表达式。
请你计算该表达式的值,返回整数结果。

逆波兰表达式(后缀表达式)规则:

- 整数(包括负数)作为运算数
- 运算符仅包含 + 、 - 、 * 、 /
- 每个运算符对应两个运算数,表达式始终有效
- 除法结果需向零截断(舍弃小数部分,保留整数)

示例

输入: tokens = ["2","1","+","3","*"]
输出: 9
解释:该逆波兰表达式对应普通算术表达式为 ((2 + 1) * 3) = 9

输入: tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出: 22

解题核心:为什么选择栈?

逆波兰表达式求值是栈的典型应用场景,这类表达式的计算逻辑天然适配栈的后进先出特性:

1. 逆波兰表达式的运算顺序:遇到数字则存储,遇到运算符则取出最近两个数字计算;
2. 栈可以完美记录遍历过程中的运算数,栈顶始终是最近的待运算数字;
3. 遇到运算符时,只需弹出两个栈顶运算数,计算后将结果重新入栈,最终栈中剩余数字就是表达式结果。

关键注意点:弹出的两个数字,先弹出的是右运算数,后弹出的是左运算数,减法和除法需注意运算顺序,避免计算错误!

详细解题思路

1. 初始化一个空栈,用于存储遍历过程中的运算数和中间计算结果;
2. 遍历字符串数组中的每一个元素:
- 如果当前元素是数字(包括负数),将其转换为整数后入栈;
- 如果当前元素是运算符:
- 弹出栈顶第一个元素,作为右运算数;
- 弹出栈顶第二个元素,作为左运算数;
- 根据运算符执行对应计算,除法需遵循向零截断规则;
- 将计算结果重新压入栈中;
3. 遍历完成后,栈中仅剩一个数字,即为表达式最终求值结果。

代码实现

整理了常用语言的实现代码,逻辑清晰,贴合解题思路:

C++ 实现

cpp
class Solution {
public:
int evalRPN(vector<string>& tokens) {
<long long> st; // 用long long避免数值溢出
for (auto& token : tokens) {
// 判断是否为运算符
if (token == "+" || token == "-" || token == "*" || token == "/") {
// 弹出右运算数、左运算数
long long num1 = st.top();
st.pop();
long long num2 = st.top();
st.pop();
// 执行对应运算
if (token == "+") st.push(num2 + num1);
if (token == "-") st.push(num2 - num1);
if (token == "*") st.push(num2 * num1);
if (token == "/") st.push(num2 / num1);
} else {
// 数字转换为整数入栈
st.push(stoll(token));
}
}
return st.top();
}
};


Python 实现

python
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for token in tokens:
if token in '+-*/':
num1 = stack.pop()
num2 = stack.pop()
if token == '+':
stack.append(num2 + num1)
elif token == '-':
stack.append(num2 - num1)
elif token == '*':
stack.append(num2 * num1)
else:
# 除法向零截断
stack.append(int(num2 / num1))
else:
stack.append(int(token))
return stack[0]


Java 实现

java
class Solution {
public int evalRPN(String[] tokens) {<Integer><>();
for (String s : tokens) {
if (s.equals("+") || s.equals("-") || s.equals("*") || s.equals("/")) {
int num1 = stack.pop();
int num2 = stack.pop();
switch (s) {
case "+":
stack.push(num2 + num1);
break;
case "-":
stack.push(num2 - num1);
break;
case "*":
stack.push(num2 * num1);
break;
case "/":
stack.push(num2 / num1);
break;
}
} else {
stack.push(Integer.parseInt(s));
}
}
return stack.pop();
}
}


复杂度分析

- 时间复杂度:O(n),n为字符串数组长度,每个元素仅入栈、出栈一次,遍历一次即可完成计算;
- 空间复杂度:O(n),最坏情况下栈中存储所有运算数,占用n个空间。

学习心得

这道题让我对栈的应用有了更深刻的理解,看似复杂的表达式计算,借助栈后进先出的特性,就能轻松解决。第一次接触逆波兰表达式确实会无从下手,但理清「数字入栈、运算符取数计算」的核心逻辑后,会发现栈完美解决了「寻找最近运算数」的问题。

同时也总结了这类栈表达式题的易错点:减法和除法的运算数顺序不能颠倒,一定要牢记先弹出的是右运算数,后弹出的是左运算数。

后续遇到中缀表达式转后缀表达式、括号匹配、相邻元素消除等问题,都可以第一时间想到用栈解决,栈的核心就是记录最近状态、快速回溯处理!

学习资料

- 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
- 视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on

http://www.jsqmd.com/news/736245/

相关文章:

  • 钢琴指法自动生成:PianoPlayer如何用算法破解演奏难题
  • 软件工程师在TVA产业化浪潮中的角色定位与机遇(5)
  • [具身智能-527]:Builder with MCP,Trae连接外部数字化工具的神器,是Trae从“代码生成”向“任务执行”的跨越。
  • 多语言AI模型数据生成:UPDESH框架实战解析
  • 别再乱用字符串了!UE开发中FString、FName、FText的保姆级选择指南(附性能对比)
  • Python 3 条件控制
  • 第三章(03):OSPFv3 for SRv6
  • 6G通信中的三混合全息波束成形技术解析
  • 软件工程师在TVA产业化浪潮中的角色定位与机遇(6)
  • 数字员工助力熊猫智汇提升AI销冠系统效能,推动企业智能化运营与创新转型
  • Claude Code深度拆解-多Agent协作 1-子Agent生成与生命周期
  • 告别公网IP烦恼:用cpolar在Windows上SSH远程连接家里CentOS服务器的保姆级教程
  • 2026年Q2南昌大规格瓷砖:南昌木纹砖瓷砖、南昌柔光砖瓷砖、南昌现代简约风瓷砖、南昌素色瓷砖、南昌卫浴五金、南昌卫浴台盆选择指南 - 优质品牌商家
  • 摘流(Traffic Draining)介绍(在服务实例下线前,先停止接收新的请求,但继续处理已在进行中请求,直到处理完成或超时,然后安全退出)preStop、readinessProbe
  • 从代码到产品:工程师如何系统培养设计品味提升开发质量
  • 2026川渝地区黄砂岩厂家权威名录:自贡石材厂家、自贡花岗石厂家、芝麻灰花岗石厂家、芝麻白花岗石厂家、芝麻黑花岗石厂家选择指南 - 优质品牌商家
  • PINN不止一种用法:从Self-adaptive到Bayesian,5种变体帮你搞定不同难题
  • 印刷企业管理系统技术演进与数智化落地深度解析:印刷报价系统/印刷报价软件/印刷生产管理软件/印刷行业软件/报价ERP系统/选择指南 - 优质品牌商家
  • 告别手动排版!这款免费卡牌批量生成工具让你的桌游设计效率提升300%
  • 微软RAG-Time项目解析:构建生产级检索增强生成应用的最佳实践
  • 为什么三甲医院IT科连夜禁用旧版VSCode?揭秘2026.1.3合规引擎强制启用的4层签名链:代码→提交→构建→部署全链路不可篡改审计
  • AI也迎来“高考”,机器人领域不断突破,AI应用发展持续推进
  • SpringBoot 日志分组
  • wechatapi iPad协议:私域批量操作的唯一解
  • GitHub开源项目进度追踪插件:自动化进度条与看板集成实战
  • LLM微调实战:使用LLM-Finetuning-Toolkit高效微调Mistral-7B模型
  • 告别逐帧标注!用SAM+TAM零代码搞定视频多目标跟踪与分割(保姆级实战)
  • EdgeRemover:彻底告别Microsoft Edge的3种专业方案
  • 第2篇:应付百万并发商品系统之需求文档
  • 从同步阻塞到毫秒级响应:PHP 9.0 + Swoole 5.1 + LangChain-PHP构建企业级AI助手,7步完成生产就绪配置