leetcode 150.逆波兰表达式求值

⭐️ 题目描述

leetcode 150.逆波兰表达式求值_第1张图片


leetcode链接:逆波兰表达式求值

思路: 假设这样一组表达式 { "2" , "1" , "+" , "3" , "*" } 这是一种后缀表达式,首先我们准备一个栈,当如果不是操作符的时候我们就把当前操作数入栈,所以在这一组表达式中 "2" , "1" 不是入栈。入栈的时候我们把 string 转换成 int 使用 stoi() 这样等会更方便我们控制。stack => {2 , 1},当我们遇到操作符的时候,就出栈两次取左右操作数,由于栈是先进后出所以先取出来的是右操作数(对于 + * 操作符操作数的顺序没有影响,但是 - / 会有顺序之分 )
  取出来之后,我们将两个操作数与操作符计算,计算出来的结果继续入栈。stack => {3},继续 "3" 不是操作符入栈,stack => {3 , 3}"*" 是操作符取出栈顶两个元素计算, stack => {9} 最后循环遍历结束,所以最后结果是在栈顶 top 位置上。

代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> filter;
        // 使用栈
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i] == "+" ||
                tokens[i] == "-" ||
                tokens[i] == "*" ||
                tokens[i] == "/"
            ) {
                // 取出左右栈操作数
                int right = filter.top();
                filter.pop();
                int left = filter.top();
                filter.pop();
                switch (tokens[i].front()) {
                    case '+':
                        filter.push(left + right);
                        break;
                    case '-':
                        filter.push(left - right);
                        break;
                    case '*':
                        filter.push(left * right);
                        break;
                    case '/':
                        filter.push(left / right);
                        break;
                }
            } else {
                // 不是操作符入栈
                filter.push(stoi(tokens[i]));
            }
        }

        // 最终结果在栈顶
        return filter.top();
    }
};

你可能感兴趣的:(刷题,leetcode,c++,刷题,学习)