iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(150.计算逆波兰表达式)
  • 760
分享到

C++实现LeetCode(150.计算逆波兰表达式)

2024-04-02 19:04:59 760人浏览 薄情痞子
摘要

[LeetCode] 150.Evaluate Reverse Polish Notation 计算逆波兰表达式 Evaluate the value of an arithmeti

[LeetCode] 150.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

Example 3:

Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
Output: 22
Explanation:
((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

逆波兰表达式就是把操作数放前面,把操作符后置的一种写法,我们通过观察可以发现,第一个出现的运算符,其前面必有两个数字,当这个运算符和之前两个数字完成运算后从原数组中删去,把得到一个新的数字插入到原来的位置,继续做相同运算,直至整个数组变为一个数字。于是按这种思路写了代码如下,但是拿到OJ上测试,发现会有Time Limit Exceeded的错误,无奈只好上网搜答案,发现大家都是用栈做的。仔细想想,这道题果然应该是栈的完美应用啊,从前往后遍历数组,遇到数字则压入栈中,遇到符号,则把栈顶的两个数字拿出来运算,把结果再压入栈中,直到遍历完整个数组,栈顶数字即为最终答案。代码如下:

解法一:


class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        if (tokens.size() == 1) return stoi(tokens[0]);
        stack<int> st;
        for (int i = 0; i < tokens.size(); ++i) {
            if (tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/") {
                st.push(stoi(tokens[i]));
            } else {
                int num1 = st.top(); st.pop();
                int num2 = st.top(); st.pop();
                if (tokens[i] == "+") st.push(num2 + num1);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            }
        }
        return st.top();
    }
};

我们也可以用递归来做,由于一个有效的逆波兰表达式的末尾必定是操作符,所以我们可以从末尾开始处理,如果遇到操作符,向前两个位置调用递归函数,找出前面两个数字,然后进行操作将结果返回,如果遇到的是数字直接返回即可,参见代码如下:

解法二:


class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        int op = (int)tokens.size() - 1;
        return helper(tokens, op);
    }
    int helper(vector<string>& tokens, int& op) {
        string str = tokens[op];
        if (str != "+" && str != "-" && str != "*" && str != "/") return stoi(str);
        int num1 = helper(tokens, --op);
        int num2 = helper(tokens, --op);
        if (str == "+") return num2 + num1;
        if (str == "-") return num2 - num1;
        if (str == "*") return num2 * num1;
        return num2 / num1;
    }
};

类似题目:

Basic Calculator

Expression Add Operators

参考资料:

https://leetcode.com/problemset/alGorithms/

Https://leetcode.com/problems/evaluate-reverse-polish-notation/discuss/47642/a-recursive-solution-in-cpp

https://leetcode.com/problems/evaluate-reverse-polish-notation/discuss/47544/Challenge-me-neat-C%2B%2B-solution-could-be-simpler

到此这篇关于c++实现LeetCode(150.计算逆波兰表达式)的文章就介绍到这了,更多相关C++实现计算逆波兰表达式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(150.计算逆波兰表达式)

本文链接: https://www.lsjlt.com/news/131418.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现LeetCode(150.计算逆波兰表达式)
    [LeetCode] 150.Evaluate Reverse Polish Notation 计算逆波兰表达式 Evaluate the value of an arithmeti...
    99+
    2024-04-02
  • Java实现简易计算器(逆波兰表达式)
    本文实例为大家分享了Java实现简易计算器的具体代码,供大家参考,具体内容如下 程序的运行环境为Windows10 ,编译环境为IDEA。 计算器有以下功能和要求:能够计算复杂表达式...
    99+
    2024-04-02
  • C++实现逆波兰表达式的例题详解
    目录1. 题目描述2. 解题思路3. 动图演示4. 代码实现1. 题目描述 2. 解题思路 逆波兰表达式由波兰的逻辑学家卢卡西维兹提出,它的特点是:没有括号,运算符总是放在和它相关...
    99+
    2022-12-21
    C++实现逆波兰表达式 C++ 逆波兰表达式
  • c语言逆波兰表达式求值的方法
    本篇内容主要讲解“c语言逆波兰表达式求值的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c语言逆波兰表达式求值的方法”吧!题目根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *...
    99+
    2023-06-19
  • 逆波兰表达式如何在Java项目中实现
    本篇文章给大家分享的是有关逆波兰表达式如何在Java项目中实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。逆波兰表达式定义:传统的四则运算被称作是中缀表达式,即运算符实在两个...
    99+
    2023-05-31
    java 逆波兰表达式 ava
  • C语言实现逆波兰式实例
    复制代码 代码如下:#include<stdio.h>#include<string.h> typedef struct{char s[20][20];int...
    99+
    2022-11-15
    C语言 逆波兰式
  • C++栈实现逆波兰式的应用
    目录一.定义二.逆波兰式的意义三.逆波兰式的实现1.方法2.代码实现一.定义 逆波兰式,又称后缀表达式,指的是操作符在其所控制的操作数后面的表达式。 举个例子,1 + 2 * 3 -...
    99+
    2024-04-02
  • C++实现LeetCode(10.正则表达式匹配)
    [LeetCode] 10. Regular Expression Matching 正则表达式匹配 Given an input string (s) and a pattern ...
    99+
    2024-04-02
  • C语言实现数学表达式运算
    本文实例为大家分享了C语言实现数学表达式运算的具体代码,供大家参考,具体内容如下 1、开发思路: (假设有表达式 2 * 3 * ( 1 + 2) ) 数字要一个一个取出放在内存中,...
    99+
    2024-04-02
  • JAVA中如何实现表达式计算源码
    这篇文章主要为大家展示了“JAVA中如何实现表达式计算源码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA中如何实现表达式计算源码”这篇文章吧。支持运算符:+-*/%><][!...
    99+
    2023-06-03
  • C语言如何实现数学表达式运算
    C语言如何实现数学表达式运算,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。大家分享了C语言实现数学表达式运算的具体代码,具体内容如下开发思路: (假设有表达式 2 * 3 ...
    99+
    2023-06-21
  • C# Lambda表达式树怎么实现
    这篇文章主要介绍“C# Lambda表达式树怎么实现”,在日常操作中,相信很多人在C# Lambda表达式树怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C# Lambda表达式树怎么实现”的疑惑有所...
    99+
    2023-06-17
  • C#利用后缀表达式解析计算字符串公式
    目录实现简单的数字的加减乘除1、解析公式转为节点信息2、转为后缀表达式3、计算后缀表达式当我们拿到一个字符串比如:20+31*(100+1)的时候用口算就能算出结果为3151,因为这...
    99+
    2023-02-23
    C#解析计算字符串公式 C#解析字符串公式 C#解析字符串 C# 后缀表达式
  • C++实现中缀表达式转化为后缀表达式详解
    目录1.题目描述2.输入输出3.解题思路4.样例解析 5.代码实现5.1.优先级确认5.2.转换函数1.题目描述 所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运...
    99+
    2024-04-02
  • C++如何实现中缀表达式转化为后缀表达式
    这篇文章将为大家详细讲解有关C++如何实现中缀表达式转化为后缀表达式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目描述所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象...
    99+
    2023-06-29
  • Golang栈结构和后缀表达式实现计算器示例
    目录引言问题中缀、后缀表达式的计算人利用中缀表达式计算值计算机利用后缀表达式计算值计算后缀表达式的代码实现中缀表达式转后缀表达式转换过程转换的代码实现总结引言 只进行基本的四则运算,...
    99+
    2024-04-02
  • C# 表达式目录树Expression的实现
    目录表达式目录树表达式目录树的拼装应用Linq to SQLExpressionVisitor表达式目录扩展通过表达式目录树实现表达式目录树 表达式目录树:语法树,或者说是一种数据结...
    99+
    2024-04-02
  • Python+eval函数实现动态地计算数学表达式详解
    目录Python 的 eval()第一个参数:expression第二个参数:globals第三个参数:locals用 eval() 计算表达式布尔表达式数学表达式通用表达式Pyth...
    99+
    2024-04-02
  • 用 Go 实现一个完整的数学表达式计算引擎
    导读这篇文章将从头开始,使用 Go 语言来实现一个完整的数学表达式计算引擎。本文采用的是抽象语法树(Abstract Syntax Tree,AST)实现方式。虽然本文的实现代码为 Go,但不用纠结于此,语言只是实现方式的一种选择,作为开发...
    99+
    2024-04-02
  • C语言运算符与表达式实例分析
    本篇内容主要讲解“C语言运算符与表达式实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言运算符与表达式实例分析”吧!表达式函 数 概 述表达式是C语言的主体。在C语言中,表达式由操作符...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作