leetcode-150 | 逆波兰表达式求值

title: leetcode-150 | 逆波兰表达式求值
date: 2019-7-27 14:40:02
comments: true
categories: “leetcode”
tags:
- leetcode 中等难度
- 栈

题目描述

根据逆波兰表示法,求表达式的值。
有效的运算符包括 +, -,*, /。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:

  • 整数除法只保留整数部分。
  • 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

输入: [“2”, “1”, “+”, “3”, “*”]
输出: 9
解释: ((2 + 1) * 3) = 9

示例 2:

输入: [“4”, “13”, “5”, “/”, “+”]
输出: 6
解释: (4 + (13 / 5)) = 6

示例 3:

输入: [“10”, “6”, “9”, “3”, “+”, “-11”, “", “/”, "”, “17”, “+”, “5”, “+”]
输出: 22
解释:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22

思路解答

逆波兰表示法,也即是后缀表达式。根据上面的几个案例,我们很容易的想到了栈的数据结构来辅助处理问题。

  1. 遇到 +, -,*, /,就顺序出栈两个数值,进行计算,然后压栈
  2. 重复上面的操作,直到输入的列表跑完
  3. 输入的列表中存储的是字符串里列表,所以还需要转换

代码实现

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        numbers = ["+","-","*","/"]
        dataStack = []
        for ele in tokens:
            if ele not in numbers:
                dataStack.append(int(ele))
            else:
                a = dataStack.pop(len(dataStack)-1)
                b = dataStack.pop(len(dataStack) - 1)
                if ele == '+':
                    dataStack.append(a+b)
                elif ele == '-':
                    dataStack.append(b-a)
                elif ele == '*':
                    dataStack.append(b*a)
                elif ele == '/':
                    dataStack.append(int(b / float(a)))
        return dataStack[0]

注意:
pythonb / a 会向下取整, 比如 -1 / 132 = -1。 题目要求是取整数部分,那么负数的时候,实际应该是向上取整, 解决方法: int(b / float(a))
python3 b / a 会转为小数计算,所以直接int(b / a), 不能 b // a

运行结果

执行用时 : 76 ms, 在Remove Nth Node From End of List的Python提交中击败了100.00% 的用户
内存消耗 : 13.5 MB, 在Remove Nth Node From End of List的Python提交中击败了31.95% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过76 ms13.5 MBpython

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

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

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

打赏作者

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

抵扣说明:

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

余额充值