代码随想录-栈与队列 | 150逆波兰表达式求值

代码随想录-栈与队列 | 150逆波兰表达式求值

LeetCode 150-逆波兰表达式求值

题目链接
代码随想录

题目描述

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

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

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

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

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

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

解题思路

判断

  • 波兰表达式相当于式二叉树中的后序遍历。
  • 本题中,每一个子表达式要得出一个结果,然后拿这个结果再进行运算。这相当于一个相邻字符串做运算的一个过程。

代码

java 复制代码
class Solution {
    public int evalRPN(String[] tokens) {
        Deque<Integer> deque = new LinkedList();
        for (String s : tokens) {
            if (s.equals("+")) {
                deque.push(deque.pop() + deque.pop());
            }else if (s.equals("-")) {
                deque.push(-deque.pop()+deque.pop());
            }else if (s.equals("*")) {
                deque.push(deque.pop()*deque.pop());
            }else if (s.equals("/")) {
                int num1 = deque.pop();
                int num2 = deque.pop();
                deque.push(num2/num1);
            }else {
                deque.push(Integer.parseInt(s));
            }
        }
        return deque.pop();
    }
}

复杂度

  • 时间复杂度
    时间复杂度为O(n)
  • 空间复杂度
    O(n)

难点

  • 需要理清楚波兰表达式运算的过程:实际上后缀表达式,是符合计算机的"思考"方式的。而我们习惯看到的表达式都是中缀表达式,但中缀表达式对计算机来说并不友好。
  • 例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法。这是很麻烦的!

总结

学习到新知识:波兰表达式。这其实是一个后缀表达式,类似于二叉树中的后序遍历。

相关推荐
F-2H26 分钟前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱056729 分钟前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
chenziang11 小时前
leetcode hot100 环形链表2
算法·leetcode·链表
_oP_i1 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx1 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康2 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
Captain823Jack2 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
豪宇刘3 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意3 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
Captain823Jack3 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词