面试经典150题——逆波兰表达式求值

Man cannot live like a beast, he should pursue knowledge and virtue. -- Dante

green mountain across body of water

1. 题目描述

image-20240305092301126

2.  题目分析与解析

2.1 思路一

这个波兰式我记得在之前上编译原理的时候学过,是对输入的代码进行解析用的。可能有一部分读者对于波兰表达式并不太熟悉,我按照题目给的一个例子来解释一下:

image-20240305092736812

比如对于上述测试用例,遍历tokens,发现2,说明它是一个操作数,继续向后走,发现1,说明是另一个操作数,然后发现 +,说明此时需要进行 2+1的操作,这个结果 =3,它又相当于一个操作数。

继续向后,发现3,当作第二个操作数,然后发现 *,进行运算,将结果又当作一个操作数。但是因为已经没有后续运算了,所以 3*3=9,9就是结果输出。

其实经过一个测试用例,应该就能很快想到使用栈来解决。因为每发现一个运算符号,就说明就要对前面的操作数进行运算了,就相当于入栈时发现入栈的元素是运算符号,就弹出两个运算数进行运算,并将新的运算结果放入栈作为一个新的运算数。

当然题目提示了:

image-20240305093304209

如果没有提示该内容,我们还需要考虑各种运算优先符,比如:(),[],{},对于这种情况就需要对左右括号进行匹配,然后取出内部内容进行运算,我们这里就不考虑了。

代码思路

  1. 定义一个栈,用来存储运算

  2. 遍历tokens

    • 当发现当前入栈元素为数字,就入栈

    • 当发现当前入栈元素是操作符,就取出两个栈中的操作数进行运算,并将运算结果放入栈

  3. 遍历结束,栈顶元素就是结果

虽然能accept,但是效果并不好

image-20240305094158759

(最后看了下官方,发现思路没什么问题,但是在判断是否为数字的过程我本来使用的是正则表达式:

tokens[i].matches("-?\\d+")

获得上述效果,但是官方用的是:

image-20240305103040462

因为这个原因导致了判定是否数字可能效率很低,如果上述思路也使用isNumber能获得如下结果:

image-20240305103025529

)

2.2 思路二

下面一种方法是对于栈空间的优化,引自力扣官方,可以看看:

image-20240305103501317

recording

后面3.2贴上带解析的代码。

3. 代码实现

3.1 思路一

image-20240305094226437

3.2 思路二

image-20240305105746437

image-20240305105646018

4. 相关复杂度分析

分析时间复杂度:

  1. evalRPN方法:

    • 时间复杂度:O(n),其中 n 为 tokens 数组的长度。因为需要遍历 tokens 数组,对于每个元素进行入栈、出栈或运算操作,都是常数时间复杂度的操作。

  2. evalRPN方法(使用isNumber):

    • 时间复杂度:同样是 O(n),因为整体操作与 evalRPN 方法相同,只是在判断是否为数字时,使用了自定义的 isNumber 方法,但这并不改变时间复杂度。

  3. evalRPN3方法:

    • 时间复杂度:同样是 O(n),因为整体操作与 evalRPN 方法相似,但是使用了数组模拟栈,数组的大小为 (n + 1) / 2,而且每个元素只入栈或出栈一次,所以时间复杂度与 evalRPN 方法相同,都是线性时间复杂度。

分析空间复杂度:

  1. evalRPN方法:

    • 空间复杂度:O(n),主要是由栈的空间消耗决定的,栈的最大空间不超过 n/2 + 1,但因为其他常数因素,可以简化为 O(n)。

  2. evalRPN方法(使用isNumber):

    • 空间复杂度:与 evalRPN 方法相同,仍然是 O(n)。

  3. evalRPN3方法:

    • 空间复杂度:这里使用数组模拟栈,数组的大小为 (n + 1) / 2,因此空间复杂度为 O(n)。

综上所述,三种方法的时间复杂度都是 O(n),空间复杂度也都是 O(n),其中 n 为 tokens 数组的长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/511814.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【触想智能】工业一体机刷卡应用知识分享

工业一体机刷卡技术是一种高效、稳定、安全的身份认证方式,具有广泛的应用场景和优势。在工业自动化控制、生产过程监测等领域,它已成为必不可少的设备之一。 一、工业一体机刷卡的原理:工业一体机刷卡的原理和普通的刷卡设备类似,都是通过读…

C# Winform画图绘制圆形

一、因为绘制的圆形灯需要根据不同的状态切换颜色,所以就将圆形灯创建为用户控件 二、圆形灯用户控件 1、创建用户控件UCLight 2、设值用户控件大小(30,30)。放一个label标签,AutoSize为false(不自动调整大小),Dock为Fill(填充),textaglign为居中显示。 private Color R…

探索Python编程世界:从入门到精通

一.Python 从入门到精通 随着计算机科学的发展,编程已经成为了一种必备的技能。而 Python 作为一种简单易学、功能强大的编程语言,越来越受到人们的喜爱。本文将为初学者介绍 Python 编程的基础知识,帮助他们踏入 Python 编程的大门&#xf…

【深度学习笔记】5_5 LeNet

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 5.5 卷积神经网络(LeNet) 在3.9节(多层感知机的从零开始实现)里我们构造了一个含单隐藏…

【2024.03.05】定时执行专家V7.1最新版GUI界面 - 基于wxWidgets 3.2.4 + CodeBlocks + GCC9.2.0

《定时执行专家》是一款制作精良、功能强大、毫秒精度、专业级的定时任务执行软件。软件具有 25 种【任务类型】、12 种【触发器】触发方式,并且全面支持界面化【Cron表达式】设置。软件采用多线程并发方式检测任务触发和任务执行,能够达到毫秒级的执行精…

PyTorch深度学习实战(38)——StyleGAN详解与实现

PyTorch深度学习实战(38)——StyleGAN详解与实现 0. 前言1. StyleGAN1.1 模型介绍1.2 模型策略分析 2. 实现 StyleGAN2.1 生成图像2.2 风格迁移 小结系列链接 0. 前言 StyleGAN (Style-Generative Adversarial Networks) 是生成对抗网络 (Generative Ad…

select函数

IO复用使程序可以同时监视多个文件描述符,提高性能。 需要指出的是, I/O 复用虽然能同时监听多个文件描述符,但它本身是阻塞的。并且当 多个文件描述符同时就绪时,如果不采取额外的措施,程序就只能按顺序依处理其中的每…

基于ERNIR3.0的文本多分类

还在用BERT做文本分类?分享一套基于预训练模型ERNIR3.0的文本多分类全流程实例【文本分类】_ernir 文本分类-CSDN博客 /usr/bin/python3 -m pip install --upgrade pip python3-c"import platform;print(platform.architecture()[0]);print(platform.machine…

Java学习笔记002——类的修饰符

在Java语言中,类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符,在创建类时用于类的声明: 1、public: 当一个类被声明为public时,它可以从任何其他类中被访问,无论这些类位于哪个包中。通常&am…

如何让 JOIN 跑得更快?

JOIN 一直是数据库性能优化的老大难问题,本来挺快的查询,一旦涉及了几个 JOIN,性能就会陡降。而且,参与 JOIN 的表越大越多,性能就越难提上来。 其实,让 JOIN 跑得快的关键是要对 JOIN 分类,分…

【C语言】Leetcode 206.反转链表

博主主页:17_Kevin-CSDN博客 收录专栏:《Leetcode》 题目 解决思路 思路一:翻转链表 struct ListNode* reverseList(struct ListNode* head) {if(head NULL){return NULL;}struct ListNode* n1 NULL,*n2 head,*n3 n2 -> next;while(…

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种,由低到高分别为Read uncommitted (读未提交)、Read committed(读提交) 、Repeatable read(可重复读) 、Serializable (串行化&a…