LeetCode 150. 逆波兰表达式求值

在这里插入图片描述

1. 逆波兰表达式求值

难度 中等 OJ链接
在这里插入图片描述
逆波兰表达式是什么呢?可能大家不是很理解,我们来看一下:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面
在这里插入图片描述
逆波兰表达式主要有以下两点优点:
1.去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。
2.适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

其实这道题的意思是:后缀表达式,我们该如何去运算
解题思路:
在这里插入图片描述
第一步:遇到操作数,入栈
在这里插入图片描述
第二步:遇到操作符,则取出栈顶两个数字进行计算,并将结果压入栈中
在这里插入图片描述
我们按照这两个步骤来走,然后遇到2,再入栈。
在这里插入图片描述
遇到 / 操作符,取栈顶两个数计算,然后将结果入栈。
在这里插入图片描述
遇到 + 操作符,取栈顶两个数计算,然后将结果入栈。
在这里插入图片描述
遇到5,入栈。
在这里插入图片描述
遇到 - ,取栈顶两个数计算,然后将结果入栈。
在这里插入图片描述
这就是后缀表达式的计算方法。

代码实现:
在这里插入图片描述
如果是操作数,我们就入栈。但我们需要将字符串转换为整数,这里我们可以用stoi函数。
在这里插入图片描述
此时,我们取到栈顶的两个数了,现在需要进行运算。但是我们不知道是那个操作符,所以这里可以使用switch语句。
在这里插入图片描述
最后,栈里只剩下最后一个数,我们返回。
在这里插入图片描述
但是这里出现了一个错误。
在这里插入图片描述
这里有一个相乘超出范围了。这个数大于int最大范围2^31-1。最后乘以-1后的值是合法的,但是倒数第二步的值是非法的。我们可以换成long类型,long在Leetcode里是8个字节。
在这里插入图片描述
这样相乘就是合法的。

C++11用包装器实现:
在这里插入图片描述

2. 如何将中缀表达式变成后缀表达式

在这里插入图片描述
第一步:遇到操作数,存储
第一个是1,我们将1存储起来。
在这里插入图片描述
第二步:遇到运算符,有三个情况:
a.栈为空,入栈
在这里插入图片描述
然后2是操作数,我们把它存储起来。然后遇到乘号。
b.和栈顶运算符比较,如果比栈顶优先级高,入栈
在这里插入图片描述
遇到3操作数,存储起来。然后遇到除号。
c.和栈顶运算符比较,比栈顶优先级低或者一样,出栈顶运算符,然后再和栈顶运算符比较,去执行b和c情况
在这里插入图片描述
所以,再次比较时,除号比加号的优先级高,除号入栈。
在这里插入图片描述
然后是操作数2,我们把它存储起来。后面是-号,比除号优先级小,出栈。
在这里插入图片描述
再和栈顶运算符比较,-号和+号的优先级一样,出栈。
在这里插入图片描述
此时栈为空,入栈。
在这里插入图片描述
然后是操作数5,存储起来。当结束时,栈里的运算符全部出栈。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值