专栏首页木又AI帮【leetcode刷题】T20-逆波兰表达式求值

【leetcode刷题】T20-逆波兰表达式求值

今天分享leetcode第20篇文章,也是leetcode第150题—逆波兰表达式求值(Evaluate Reverse Polish Notation),地址是:https://leetcode.com/problems/evaluate-reverse-polish-notation/【英文题目】(学习英语的同时,更能理解题意哟~)Evaluate the value of an arithmetic expression in Reverse Polish Notation.Valid operators are +, -, *, /. Each operand may be an integer or another expression.Note:Division between two integers should truncate toward zero.The given RPN expression is always valid. That means the expression would always evaluate to a result and there won't be any divide by zero operation.Example 1:Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9
Example 2:Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
【中文题目】根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]
输出: 9
解释: ((2 + 1) * 3) = 9
示例 2:输入: ["4", "13", "5", "/", "+"]
输出: 6
解释: (4 + (13 / 5)) = 6
【思路】逆波兰表示法,也称为后缀表示法,即将运算符写在操作数之后。比如:3+5的逆波兰表示法为["3", "5", "+"],(3+5) * 2的逆波兰表示法为["3", "5", "+", "2", "*"]。逆波兰式在计算机看来是比较简单易懂的结构,因为计算机普遍采用的内存结构是栈式结构。这是使用栈的典型题,遇到数字添加元素,遇到操作符弹出元素进行相应操作即可。有一点需要注意的是:c++对于两个整数相除结果,正数向下取整,负数向上取整;而python都是向下取整。本题取整需要按照c++取整方式。【代码】python版本class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        op = set('+-*/')
        ls = []
        for t in tokens:
            # 是符号
            if t in op:
                b = ls.pop()
                a = ls.pop()
                if t == '+':
                    ls.append(a + b)
                elif t == '-':
                    ls.append(a - b)
                elif t == '*':
                    ls.append(a * b)
                else:
                    # python和C++对整数相除取整的不同之处
                    # c++:正数向下取整,负数向上取整
                    res = abs(a) / abs(b)
                    if a * b < 0:
                        res *= -1
                    ls.append(res)
                print(ls[-1])
            # 是数字
            else:
                ls.append(int(t))
        return ls[0]
C++版本class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> num;
        set<string> op = {"+", "-", "*", "/"};
        int a, b;
        for(int i=0; i < tokens.size(); i++){
            string t = tokens[i];
            if(op.find(t) != op.end()){
                b = num.top();
                num.pop();
                a = num.top();
                num.pop();
                if(t == "+")
                    num.push(a + b);
                if(t == "-")
                    num.push(a - b);
                if(t == "*")
                    num.push(a * b);
                if(t == "/")
                    num.push(a / b);
            }else
                num.push(atoi(t.c_str()));
        }
        return num.top();
    }
};

本文分享自微信公众号 - 木又AI帮(gh_eaa31cab4b91),作者:木又

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【leetcode刷题】T116-二叉树的锯齿形层次遍历

    https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

    木又AI帮
  • 【leetcode刷题】T61-整数转罗马数字

    例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II ...

    木又AI帮
  • 【leetcode刷题】20T14-有效的括号

    https://leetcode-cn.com/problems/valid-parentheses/

    木又AI帮
  • spark streaming窗口聚合操作后如何管理offset

    很多知识星球球友问过浪尖一个问题: 就是spark streaming经过窗口的聚合操作之后,再去管理offset呢?

    Spark学习技巧
  • etl作业部署与调度——taskctl管理概述

    TASKCTL是一款功能全面的作业自动化调度技术管理工具。所谓作业,是指部署在网络中不同计算机上的各种程序或系统命令。通过TASKCTL,可以快速将这些作业组织...

    taskctl官方频道
  • 5 个优秀前端 UI 框架 | 码云周刊第 65 期

    码云Gitee
  • ElasticSearch 分词器,了解一下

    这篇文章主要来介绍下什么是 Analysis ,什么是分词器,以及 ElasticSearch 自带的分词器是怎么工作的,最后会介绍下中文分词是怎么做的。

    武培轩
  • 基于Flink+Hive构建流批一体准实时数仓

    基于 Hive 的离线数仓往往是企业大数据生产系统中不可缺少的一环。Hive 数仓有很高的成熟度和稳定性,但由于它是离线的,延时很大。在一些对延时要求比较高的场...

    深度学习与Python
  • Linux下cron周期性计划任务

    前面介绍的at是一次性任务,如果我们要周期性实行任务就要使用cron服务: 查看cron任务是否active:

    gzq大数据
  • 视频 | 谷歌新一代WaveNet :深度学习怎么生成语音?

    AI 科技评论按:这里是雷锋字幕组编译的 Two minutes paper 专栏,每周带大家用碎片时间阅览前沿技术,了解 AI 领域的最新研究成果。 原标题:...

    AI科技评论

扫码关注云+社区

领取腾讯云代金券