逆波兰表达式是个啥啊,有没有大佬知道啊😭😭😭

20 阅读4分钟

引言

大家好啊,我是前端拿破轮😁。

跟着卡哥学算法有一段时间了,通过代码随想录的学习,受益匪浅,首先向卡哥致敬🫡。

但是在学习过程中我也发现了一些问题,很多当时理解了并且AC的题目过一段时间就又忘记了,或者不能完美的写出来。根据费曼学习法,光有输入的知识掌握的是不够牢靠的,所以我决定按照代码随想录的顺序,输出自己的刷题总结和思考。同时,由于以前学习过程使用的是JavaScript,而在2025年的今天,TypeScript几乎成了必备项,所以本专题内容也将使用TypeScript,来巩固自己的TypeScript语言能力。

题目信息

逆波兰表达式求值

leetcode题目链接

给你一个字符串数组 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]);
};

时间复杂度: O(N)O(N), 只遍历一次

空间复杂度: O(N)O(N),需要一个辅助栈

总结

本题考查逆波兰表达式的求值,也是栈的经典问题,实际上计算机中在进行运算的时候,往往就是采用逆波兰表达式来存储运算信息的。原因就是这种运算方式很容易用计算机实现,就是用我们学习的栈即可。而中缀表达式虽然符合我们人的阅读习惯,但是却不适合在计算机中存储运算。、

好了,这篇文章就到这里啦,如果对您有所帮助,欢迎点赞,收藏,分享👍👍👍。您的认可是我更新的最大动力。由于笔者水平有限,难免有疏漏不足之处,欢迎各位大佬评论区指正。

往期推荐✨✨✨

我是前端拿破轮,关注我,一起学习前端知识,我们下期见!