LeedCode 150 逆波兰表达式求值 c++ 《接解题分析加实现代码》

和前面的一样,我们先看下题目的要求:

根据逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 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

通过题目的要求:我们可以理解题目的要求,但是该有什么样的思路解决这一道问题呢?有什么思路吗?

我们使用的是:《 中缀转后缀》

我们来分析一下:
首先是:我们要知道,题目的优先级顺序,‘+’,‘ - ’ 为一个优先级,‘*’,‘ / ’为一个优先级;
第二部:我们应该怎么样实现一个判断优先级,那么现在我们就用一个栈,来实现,遇到第一个数,先入栈,然后,继续往下面走,遇到第一操作符,先入栈,遇到第一个操作符,先入栈,然后查看第二给值 ,继续放栈里面,然后继续操作符,判断与第一个操作符的优先级关系,是否优先,计算,然后入栈,和上面的重复就行了。

LeedCode 150 逆波兰表达式求值 c++ 《接解题分析加实现代码》_第1张图片
画的不太好,嘿嘿,大概理解一下;
第三步;
大多的时候,不仅仅是加减乘除,还有括号,那么,括号的优先级怎么样?
这里说明一下,括号的优先级比较低,遇到括号,不用管,直接继续计算。

下面,我们看一下实现的代码:

class Solution {
public:
    int evalRPN(vector& tokens) {
        stack st;
        //首先先遍历一遍:
        for(const auto& str : tokens)
        {
            if(str == "+" || str == "-" || str == "*" || str == "/")
            {
                int right = st.top();
                st.pop();
                int left = st.top();
                st.pop();
                switch(str[0])
                {
                    case '+':
                          st.push(left + right);
                        break;
                    case '-':
                          st.push(left - right);
                        break;
                    case '*':
                        st.push(left * right);
                        break;
                    case '/':
                        st.push(left / right);
                        break;
                }
            }
            else
            {
                st.push(atoi(str.c_str()));        //把字符串转成整形;
            }
        }
             return st.top();
    }
};

这段程序我也有了一点的补充,所以理解是没有问题了,那么可以自己实现以下了。

你可能感兴趣的:(LeetCode试题)