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

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

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

内存管理发布于 2026/3/24更新于 2026/8/2153 浏览
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);
            }  {
                data.((str));
            }
        }
         data.();
    }
};
else
push
stoi
return
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

更多推荐文章

查看全部
  • 111 页全面综述:大模型评测体系与未来展望
  • SketchUp STL 插件使用指南:3D 打印核心技巧与安装配置
  • Pico 4XVR 1.10.13 安装与使用指南
  • 低代码助力集团企业实现多系统统一管理
  • 基于 Lucene 构建自定义推荐引擎方案
  • Linux 上通过 Docker 快速部署 Dify
  • Vue Element UI 级联选择器 Props 配置详解
  • 主流 Python 开发编辑器推荐
  • OpenClaw Web 管理面板配置与大模型集成实践
  • DGX Spark 部署 vLLM 与 Open WebUI 运行 Qwen3-Coder-FP8
  • 离散 PR 控制器原理、C 语言实现及逆变闭环验证
  • Claude Code 本地配置与使用指南
  • 基于 WebSocket 的外汇实时数据接入方案
  • Web 自动化测试实战:Selenium 常用函数全解析与场景化应用
  • Open3D.Art 生成模型到拓竹打印的实用流程
  • 网络安全入门教程与学习路线规划
  • 2023 第十四届蓝桥杯国赛 C/C++ 大学 B 组真题及题解
  • Ubuntu 下 CUDA 环境安装与配置
  • Git Bash 在 Windows 系统下的安装与配置指南
  • JavaAI 智能编程助手:功能特性与全流程开发指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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