跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ LeetCode 算法题解析:逆波兰表达式与滑动窗口

四道 C++ LeetCode 算法题的解法。包括使用栈计算逆波兰表达式求值,利用优先队列和单调队列解决滑动窗口最大值问题,通过哈希表配合最小堆获取前 K 个高频元素,以及使用栈简化 Unix 风格文件路径。内容涵盖数据结构应用与字符串处理技巧。

内存管理发布于 2026/3/24更新于 2026/7/240 浏览
C++ LeetCode 算法题解析:逆波兰表达式与滑动窗口

150 逆波兰表达式求值

给你一个字符串数组 tokens,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+'、'-'、'*' 和 '/'。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

后缀表达式求值是前后中里面最简单的。

class Solution {
public:
    stack<int> data;
    int evalRPN(vector<string>& tokens) {
        int ans;
        int source1, source2;
        for (string str : tokens) {
            if (str == "+" || str == "-" || str == "*" || str == "/") {
                source1 = data.top(); data.pop();
                source2 = data.top(); data.pop();
                if(str == "+") data.push(source1 + source2);
                if(str == "-") data.push(source2 - source1);
                if(str == "*") data.push(source1 * source2);
                if(str == "/") data.push(source2 / source1);
            } else {
                data.push(stoi(str));
            }
        }
        return data.top();
    }
};

239 滑动窗口最大值

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值。

给出最大堆版本的和优先队列版本的,本质上都是堆。优先队列表征出了一个单调递减队列,会动态维护队列中元素。具体方法为:如果元素入队后队列符合单调递减,则入队;如果元素入队后不符合单调递减,则队尾不断出队,直到符合条件后停止淘汰队尾,然后元素入队。因为需要的是 top1 不是 topk,所以使用优先级队列更好。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int length = nums.size();
        priority_queue<pair<int, int>> maxheap;
        for (int i = 0; i < k; i++) {
            maxheap.push({nums[i], i});
        }
        int left = 0, right = k;
        vector<int> res;
        res.emplace_back(maxheap.top().first);
        while (right < length) {
            left++;
            if (right != length) maxheap.push({nums[right], right});
            right++;
            while (!maxheap.empty() && maxheap.top().second < left) {
                maxheap.pop();
            }
            res.emplace_back(maxheap.top().first);
        }
        return res;
    }
};
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int length = nums.size();
        vector<int> res;
        deque<int> q;
        for (int i = 0; i < length; i++) {
            while (!q.empty() && nums[q.back()] < nums[i]) {
                q.pop_back();
            }
            q.push_back(i);
            if (q.front() < i - k + 1) q.pop_front();
            if (i >= k - 1) res.emplace_back(nums[q.front()]);
        }
        return res;
    }
};

347 前 K 个高频元素

给你一个整数数组 nums 和一个整数 k,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。

需要注意,在 pair 里面,频率是 first,元素是 second。这样的话可以顺水推舟 greater 缺省按照字典序排序。否则需要自行制定比较方法。

class Solution {
public:
    vector<int> topKFrequent(vector<int>& nums, int k) {
        vector<int> res;
        unordered_map<int, int> m;
        using Node = pair<int, int>; // frequency, element.
        priority_queue<Node, vector<Node>, greater<Node>> q;
        for (int num : nums) {
            m[num] += 1;
        }
        for (auto it = m.begin(); it != m.end(); it++) {
            q.push({it->second, it->first});
            if (q.size() > k) q.pop();
        }
        while (!q.empty()) {
            res.emplace_back(q.top().second);
            q.pop();
        }
        return res;
    }
};

71 简化路径

给你一个字符串 path,表示指向某一文件或目录的 Unix 风格 绝对路径(以 '/' 开头),请你将其转化为 更加简洁的规范路径。

在 Unix 风格的文件系统中规则如下:

  • 一个点 '.' 表示当前目录本身。
  • 此外,两个点 '..' 表示将目录切换到上一级(指向父目录)。
  • 任意多个连续的斜杠(即,'//' 或 '///')都被视为单个斜杠 '/'。
  • 任何其他格式的点(例如,'...' 或 '....')均被视为有效的文件/目录名称。

返回的 简化路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/'。
  • 最后一个目录名(如果存在)不能 以 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径。

可以使用 size_t 类型存储位置和判断 string::npos,更优雅,此处未使用。需要注意 erase 和 length 之间的动态关系。

class Solution {
public:
    string simplifyPath(string path) {
        int length = path.size();
        if (length > 0 && path[length - 1] == '/') path.erase(length - 1, 1);
        for (int i = 0; i < path.size(); i++) {
            if (i > 0 && path[i] == '/' && path[i - 1] == '/') {
                path.erase(i - 1, 1);
                i--;
            }
        }
        stack<string> s;
        int start = 0, end = 0;
        int newlength = path.size();
        for (int i = 0; i < newlength; i++) {
            if (path[i] == '/') start = i;
            if (i == newlength - 1 || path[i + 1] == '/') end = i;
            if (start < end) {
                string sub = path.substr(start, end - start + 1);
                if (sub == "/.") { // nop.
                } else if (sub == "/..") {
                    if (!s.empty()) {
                        s.pop();
                    }
                } else {
                    s.push(sub);
                }
            }
        }
        string res;
        while (!s.empty()) {
            res = s.top() + res;
            s.pop();
        }
        if (res == "") return "/";
        return res;
    }
};

目录

  1. 150 逆波兰表达式求值
  2. 239 滑动窗口最大值
  3. 347 前 K 个高频元素
  4. 71 简化路径
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ERNIE-4.5-0.3B 轻量模型部署指南与性能测评
  • 基于 Java SpringBoot 的旅游网站系统设计与实现
  • C/C++ 算法入门:多状态动态规划与打家劫舍股票问题
  • 大模型全面解析:原理、训练流程与应用场景详解
  • ROS2 Humble 环境下 Mid360 雷达 FAST-LIO 算法部署教程
  • 使用 Fire 库为 Python 脚本快速生成命令行接口
  • 八种常见排序算法详解与实现
  • 基于 Dify 的数据分析应用搭建实战
  • AI IDE 与辅助编程能否助程序员告别 996
  • 双指针算法实战:移动零与复写零解析
  • Python:self 详解
  • VSCode 本地运行 DeepSeek 模型指南
  • 企业级大模型构建:知识库核心与落地实践
  • 数据结构与算法:递归原理及 Java 实现案例
  • PostgreSQL 模式 (SCHEMA) 详解:数据库对象命名空间管理
  • 基于 Java 与高德地图 API 的县域烟花销售点自动化盘点方案
  • 前端状态管理:Redux、Zustand 与 Jotai 方案对比
  • 跨国企业 Git 连接困境分析与智能代理配置方案
  • 前端设计模式深度解析与实战
  • Java 集成高德开放平台 POI 搜索 API 实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online