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

Some examples:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

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

解法一:

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

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

解法二:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        int op = tokens.size() - 1;
        return helper(tokens, op);
    }
    int helper(vector<string>& tokens, int& op) {
        string s = tokens[op];
        if (s == "+" || s == "-" || s == "*" || s == "/") {
            int v2 = helper(tokens, --op);
            int v1 = helper(tokens, --op);
            if (s == "+") return v1 + v2;
            else if (s == "-") return v1 - v2;
            else if (s == "*") return v1 * v2;
            else return v1 / v2;
        } else {
            return stoi(s);
        }
    }
};

本文转自博客园Grandyang的博客,原文链接:计算逆波兰表达式[LeetCode] Evaluate Reverse Polish Notation ,如需转载请自行联系原博主。

相关文章
|
6月前
【Leetcode -748.最短补全词 -762.二进制表示中质数个计算置位】
【Leetcode -748.最短补全词 -762.二进制表示中质数个计算置位】
22 0
|
3月前
|
存储
leetcode:415. 字符串相加(模拟竖式计算)
leetcode:415. 字符串相加(模拟竖式计算)
23 0
|
3月前
|
SQL
leetcode-SQL-1440. 计算布尔表达式的值
leetcode-SQL-1440. 计算布尔表达式的值
29 1
|
3月前
leetcode-1716:计算力扣银行的钱
leetcode-1716:计算力扣银行的钱
21 0
|
4月前
[leetcode 数位计算]2520. 统计能整除数字的位数
[leetcode 数位计算]2520. 统计能整除数字的位数
|
6月前
【Leetcode -2236.判断根节点是否等于子节点之和 -2331.计算布尔二叉树的值】
【Leetcode -2236.判断根节点是否等于子节点之和 -2331.计算布尔二叉树的值】
20 0
|
11月前
|
算法 C++ Python
每日算法系列【LeetCode 357】计算各个位数不同的数字个数
每日算法系列【LeetCode 357】计算各个位数不同的数字个数
|
11月前
|
人工智能 搜索推荐 vr&ar
每日一题[LeetCode 315]计算右侧小于当前元素的个数
发现leetcode的困难难度做起来还是需要点时间的(还是我太菜了),而且可能大多数人也不能接受,所以明天开始穿插做中等难度题目。
|
11月前
力扣315计算右侧小于当前元素的个数
力扣315计算右侧小于当前元素的个数
64 0
|
11月前
算法力扣---2651. 计算列车到站时间
给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。
91 0

热门文章

最新文章