逆波兰表达式求值

题目链接

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

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

示例:

输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9

思路

解法一:

使用栈

  1. 判断字符是否为符号,若为数字,则转成相应的十进制数,将数字放到栈中;
  2. 若为符号,则从栈中 push 出两个数,根据栈的特性,第一个数是num2,第二个数是num1
  3. 然后判断符号,将运算结果 push 到栈中;
  4. 最后栈中只剩下最后的结果。
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> stk;
        int n = tokens.size();
        for (int i = 0; i < n; i++) {
            string& token = tokens[i];
            if (isNumber(token)) {
                stk.push(atoi(token.c_str())); // 转成数字
            } else {
                int num2 = stk.top(); //出栈的第一个数是num2
                stk.pop();
                int num1 = stk.top(); //出栈的第二个数是num1
                stk.pop();
                switch (token[0]) {
                    case '+':
                        stk.push(num1 + num2);
                        break;
                    case '-':
                        stk.push(num1 - num2);
                        break;
                    case '*':
                        stk.push(num1 * num2);
                        break;
                    case '/':
                        stk.push(num1 / num2);
                        break;
                }
            }
        }
        return stk.top();
    }

    bool isNumber(string& token) {
        return !(token == "+" || token == "-" || token == "*" || token == "/");
    }
};