解题思路

  1. 使用栈来存储数字
  2. 遍历表达式:
    • 如果是数字,直接入栈
    • 如果是运算符:
      • 弹出栈顶的两个数字(注意顺序)
      • 进行相应的运算
      • 将结果压入栈中
  3. 最后栈顶的数字就是表达式的值

代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> st;
        
        for(string& s : tokens) {
            if(s == "+" || s == "-" || s == "*" || s == "/") {
                int b = st.top(); st.pop();
                int a = st.top(); st.pop();
                
                if(s == "+") st.push(a + b);
                else if(s == "-") st.push(a - b);
                else if(s == "*") st.push(a * b);
                else st.push(a / b);
            } else {
                st.push(stoi(s));
            }
        }
        
        return st.top();
    }
};
import java.util.Stack;

public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> st = new Stack<>();
        
        for(String s : tokens) {
            if(s.equals("+") || s.equals("-") || 
               s.equals("*") || s.equals("/")) {
                int b = st.pop();
                int a = st.pop();
                
                if(s.equals("+")) st.push(a + b);
                else if(s.equals("-")) st.push(a - b);
                else if(s.equals("*")) st.push(a * b);
                else st.push(a / b);
            } else {
                st.push(Integer.parseInt(s));
            }
        }
        
        return st.peek();
    }
}
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        st = []
        
        for token in tokens:
            if token in ['+', '-', '*', '/']:
                b = st.pop()
                a = st.pop()
                
                if token == '+':
                    st.append(a + b)
                elif token == '-':
                    st.append(a - b)
                elif token == '*':
                    st.append(a * b)
                else:
                    # Python的除法需要特殊处理,确保结果向0取整
                    st.append(int(a / b))
            else:
                st.append(int(token))
        
        return st[-1]

算法及复杂度分析

  • 算法:栈的基本操作
  • 时间复杂度:,其中 是表达式的长度
  • 空间复杂度:,最坏情况下栈需要存储所有数字

注意事项

  1. 处理除法时需要注意:
    • Python需要特殊处理除法,确保结果向 取整
    • 注意被除数和除数的顺序
  2. 字符串转数字:
    • C++: stoi()
    • Java: Integer.parseInt()
    • Python: int()
  3. 运算符判断:
    • Java中字符串比较要用 equals()
    • Python可以使用 in 运算符