引言
大家好啊,我是前端拿破轮😁。
跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。
但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考。同时,由于以前学习过程使用的是JavaScript
,而在2025年的今天,TypeScript
几乎成了必备项,所以本专题内容也将使用TypeScript
,来巩固自己的TypeScript
语言能力。
题目信息
逆波兰表达式求值
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
有效的算符为 '+'、'-'、'*' 和 '/' 。 每个操作数(运算对象)都可以是一个整数或者另一个表达式。 两个整数之间的除法总是 向零截断 。 表达式中不含除零运算。 输入是一个根据逆波兰表示法表示的算术表达式。 答案及所有中间计算结果可以用 32 位 整数表示。
题目分析
首先我们要知道什么是逆波兰表达式。逆波兰表达式又叫做后缀表达式。是计算机中运算的常用表达方式。我们常见的运算是中缀表达式,比如3+4
。+
放在两个运算数字之间。而像这种34+
,运算符+
放在两个数字的后面。
给定一个逆波兰表达式,想要求他的值的话,还是按照从左到右遍历,如果是普通数字,就直接压入栈中,如果是运算符,则直接将栈顶的两个元素弹出,然后按照运算规则进行运算,再将结果压入栈中。
最后的话返回栈中剩下的唯一元素即可。
这里有一个易错点就是题目给定的是字符串数组,所以在进行运算之前一定要转换为数字再进行运算。
题解
function evalRPN(tokens: string[]): number {
// 辅助栈
const stack = [];
// 遍历数组
for (let token of tokens) {
// 正则匹配,如果当前字符是数字,则压入栈中
if (/\d/.test(token)) {
stack.push(token);
} else {
// 如果不是数字,则说明是运算符
// 弹出栈顶两个元素并进行运算
const num2 = Number(stack.pop());
const num1 = Number(stack.pop());
// 运算结果
let result: number;
// 根据运算符情况进行判断
switch (token) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/': result = Math.trunc(num1 / num2); break;
}
// 将结果压入栈中
stack.push(result);
}
}
// 返回栈中最后剩下的元素
return Number(stack[0]);
};
时间复杂度: , 只遍历一次
空间复杂度: ,需要一个辅助栈
总结
本题考查逆波兰表达式的求值,也是栈的经典问题,实际上计算机中在进行运算的时候,往往就是采用逆波兰表达式来存储运算信息的。原因就是这种运算方式很容易用计算机实现,就是用我们学习的栈即可。而中缀表达式虽然符合我们人的阅读习惯,但是却不适合在计算机中存储运算。、
好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。
往期推荐✨✨✨
我是前端拿破轮,关注我,一起学习前端知识,我们下期见!