leetcode算法(150.逆波兰表达式求值)

逆波兰表达式:是一种后缀表达式,所谓后缀就是指运算符写在后面。(对二叉树进行后序遍历)

适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

  • tokens[i]std::string 类型(因为 tokensvector<string>

  • '+'char 类型(单字符字面量)

  • 所以用 "+"

cpp 复制代码
class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        // 力扣修改了后台测试数据,需要用long long来避免整数溢出
        stack<long long> st; // 使用栈存储运算的中间结果
        
        for (int i = 0; i < tokens.size(); i++) {
            // 判断当前token是否为运算符
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                // 如果是运算符,从栈顶取出两个操作数
                // 注意顺序:先弹出的是第二个操作数(后入栈的)
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                
                // 根据运算符进行相应运算,注意操作数顺序
                if (tokens[i] == "+") st.push(num2 + num1);   // 加法
                if (tokens[i] == "-") st.push(num2 - num1);   // 减法(注意顺序)
                if (tokens[i] == "*") st.push(num2 * num1);   // 乘法
                if (tokens[i] == "/") st.push(num2 / num1);   // 整数除法
            } else {
                // 当前token是数字,将其转换为long long并入栈
                // stoll: string to long long
                st.push(stoll(tokens[i]));
            }
        }

        // 栈中最后剩下的就是计算结果
        long long result = st.top();
        st.pop(); // 弹出栈顶元素(清理栈,虽然函数返回前不pop也可以)
        return result; // 返回计算结果(隐式转换为int)
    }
};
相关推荐
Keven_1137 分钟前
算法札记:如何卡SPFA
算法·spfa
可编程芯片开发1 小时前
基于电压电流双闭环控制的三相整流器系统simulink建模与仿真
算法
可编程芯片开发1 小时前
基于ADRC自抗扰算法的UAV飞行姿态控制系统simulink建模与仿真
算法
学究天人1 小时前
数学公理体系大全:第七章 连续统假设与力迫法简介
人工智能·算法·机器学习·数学建模·动态规划·图论·抽象代数
Keven_111 小时前
算法札记:SPFA什么时候用队列什么时候用栈
算法·spfa
:-)2 小时前
基础算法-选择排序
数据结构·算法·排序算法
浮沉9872 小时前
二分查找算法例题(一)
算法
退休倒计时2 小时前
【每日一题】LeetCode 17. 电话号码的字母组合 TypeScript
算法·leetcode·typescript
粘稠的浆糊2 小时前
[AtCoder - abc465_d ]X to Y题解
数据结构·c++·算法
海清河晏1112 小时前
数据结构 | 二叉平衡搜索树
开发语言·数据结构·visual studio