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

 更新时间:2021年07月29日 14:30:15   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(150.计算逆波兰表达式),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[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++实现计算逆波兰表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言如何实现顺序表(数据结构)

    C语言如何实现顺序表(数据结构)

    这篇文章主要介绍了C语言如何实现顺序表(数据结构)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Qt多版本共存使用实现组件增删

    Qt多版本共存使用实现组件增删

    本文主要介绍了Qt多版本共存使用实现组件增删,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C语言设计一个闪闪的圣诞树

    C语言设计一个闪闪的圣诞树

    本文使用C语言基础知识在控制台打印一个圣诞树效果,真的很简单哦,一起通过本文学习吧
    2016-12-12
  • C++之异常处理详解

    C++之异常处理详解

    C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理
    2013-08-08
  • C++ 回调接口设计和二进制兼容详细

    C++ 回调接口设计和二进制兼容详细

    再开发视频编辑 SDK,SDK的回调接口设计成 C 风格,结构中放着一些函数指针,既然对外接口是 C++,为什么不直接使用 C++ 的虚函数?这篇文章便对这一问题做个详细介绍,需要的朋友可以参考一下
    2021-09-09
  • OpenCV使用邻居访问扫描图像的操作方法

    OpenCV使用邻居访问扫描图像的操作方法

    在图像处理中,有时需要根据某个像素的相邻像素的值计算该像素位置的值,当这个邻域包括上一行和下一行的像素时,就需要同时扫描图像的多行像素,本节中我们将介绍如何通过邻居访问扫描图像,感兴趣的朋友一起看看吧
    2023-01-01
  • C++ 重载运算符在HotSpot VM中的应用小结

    C++ 重载运算符在HotSpot VM中的应用小结

    C++支持运算符重载,对于Java开发者来说,这个可能比较陌生一些,因为Java不支持运算符重载,下面介绍一下HotSpot VM中的运算符重载,感兴趣的朋友跟随小编一起看看吧
    2023-09-09
  • 教你用c++从头开始实现决策树

    教你用c++从头开始实现决策树

    从头实现一个分类决策树分类器似乎是一个适当的挑战。这已经被证明是一个测试但有益的学习旅程,我想分享一些我在这个过程中的主要经验,对c++实现决策树相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • C++成员初始化列表

    C++成员初始化列表

    这篇文章主要介绍了C++成员初始化列表,除了可以使用构造函数对类成员进行初始化之外,C++还提供了另外一种初始化的方法,叫做成员初始化列表。下面来看看文章的详细吧,需要的朋友可以参考一下
    2022-01-01
  • C++中const的常见用法详解

    C++中const的常见用法详解

    const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的,本文为大家整理了const的几种使用,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-06-06

最新评论