150. 逆波兰表达式求值

150. 逆波兰表达式求值

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

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

注意 两个整数之间的除法只保留整数部分。

可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

 

示例 1:

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

示例 2:

输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6

示例 3:

输入:tokens = ["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

 

提示:

  • 1 <= tokens.length <= 104
  • tokens[i] 是一个算符("+""-""*""/"),或是在范围 [-200, 200] 内的一个整数

 

解析:

压栈,遇到运算符就弹出栈顶两个,运算即可

中缀->后缀表达式:运算符优先级严格递增栈,遇到左括号压栈,右括号出栈,括号内也符合严格递增

class Solution {
public:
    int transfer(string str)
    {
        int flag = str[0] == '-' ? 1 : 0;
        int ret = 0;
        for(int i = flag; i < str.length(); i++)
        {
            ret *= 10;
            ret += str[i] - '0';
        }
        return flag == 1 ? -ret : ret;
    }



    int evalRPN(vector<string>& tokens) {
        int ret = 0;
        stack<string> ss;
        for(int i = 0; i < tokens.size(); i++)
        {
            if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/")
            {
                ss.push(tokens[i]);
            }
            else
            {
                int y = transfer(ss.top()); ss.pop();
                int x = transfer(ss.top()); ss.pop();
                if(tokens[i] == "+")
                {
                    ss.push(to_string(x + y));
                }
                else if(tokens[i] == "-")
                    ss.push(to_string(x - y));
                else if(tokens[i] == "*")
                    ss.push(to_string(x * y));
                else ss.push(to_string(int(x / y)));
            }

        }
        ret = transfer(ss.top());
        return ret;

    }
};

 

posted @ 2022-09-12 22:06  WTSRUVF  阅读(18)  评论(0编辑  收藏  举报