当前位置: 首页 > news >正文

第五章 栈与队列

目录

  • 一、用栈实现队列
  • 二、用队列实现栈
  • 三、有效的括号
  • 四、删除字符串中的所有相邻重复项
  • 五、逆波兰表达式求值
  • 六、滑动窗口最大值
  • 七、前 K 个高频元素

一、用栈实现队列

Leetcode 232

class MyQueue {
public:stack<int> in, out;MyQueue() {}void push(int x) {in.push(x);}int pop() {if (out.empty()) while (!in.empty())out.push(in.top()), in.pop();int res = out.top();out.pop();return res;}int peek() {int res = this->pop();out.push(res);return res;}bool empty() {return in.empty() && out.empty();}
};

二、用队列实现栈

Leetcode 225

两个队列:

class MyStack {
public:queue<int> que1, que2; // que2用于备份que1MyStack() {}void push(int x) {que1.push(x);}int pop() {int cnt = que1.size();cnt -- ;while (cnt -- )que2.push(que1.front()), que1.pop();int res = que1.front();que1.pop();que1 = que2;while (!que2.empty()) que2.pop();return res;}int top() {return que1.back();}bool empty() {return que1.empty();}
};

一个队列:

class MyStack {
public:queue<int> que;MyStack() {}void push(int x) {que.push(x);}int pop() {int cnt = que.size();cnt -- ;while (cnt -- )que.push(que.front()), que.pop();int res = que.front();que.pop();return res;}int top() {return que.back();}bool empty() {return que.empty();}
};

三、有效的括号

Leetcode 20

class Solution {
public:bool isValid(string s) {if (s.size() % 2) return false;stack<char> st;for (int i = 0; i < s.size(); i ++ ) {char c = s[i];if (c == '(') st.push(')');else if (c == '{') st.push('}');else if (c == '[') st.push(']');else if (st.empty() || st.top() != c) return false; // 为空或者不匹配else st.pop(); // 相等}return st.empty();}
};

四、删除字符串中的所有相邻重复项

Leetcode 1047

开辟一个栈:

class Solution {
public:string removeDuplicates(string s) {stack<char> st;for (char c: s) if (st.empty() || c != st.top()) st.push(c);else st.pop();string res = "";while (!st.empty())res += st.top(), st.pop();reverse(res.begin(), res.end());return res;}
};

直接使用字符串作为栈:

class Solution {
public:string removeDuplicates(string s) {string res;for (char c: s) if (res.empty() || res.back() != c) res.push_back(c);else res.pop_back();return res;}
};

五、逆波兰表达式求值

Leetcode 150

class Solution {
public:int evalRPN(vector<string>& s) {stack<long long> st;for (int i = 0; i < s.size(); i ++ )if (s[i] == "+" || s[i] == "-" || s[i] == "*" || s[i] == "/") {long long a = st.top(); st.pop();long long b = st.top(); st.pop();if (s[i] == "+") st.push(b + a); if (s[i] == "-") st.push(b - a); // 注意顺序if (s[i] == "*") st.push(b * a);if (s[i] == "/") st.push(b / a);} else st.push(stoll(s[i]));int res = st.top(); st.pop();return res;}
};

六、滑动窗口最大值

Leetcode 239

单调队列经典题目,具体实现看参考文章

这个题目参考文章里面使用了库 deque 方便再前后两端进行操作,但是这里可以直接使用一个数组 q q q 代替,效率更高,数组 q q q 的作用是队列中队头和队尾的位置。

class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n = nums.size();vector<int> q(n, 0), res;int hh = 0, tt = -1;for (int i = 0; i < n; i ++ ) {if (hh <= tt && i - k + 1 > q[hh]) hh ++ ;while (hh <= tt && nums[q[tt]] <= nums[i]) tt -- ;q[ ++ tt] = i;if (i - k + 1 >= 0) res.push_back(nums[q[hh]]);}return res;}
};

七、前 K 个高频元素

Leetcode 347

使用优先队列(披着队列外衣的堆),如果使用的是大顶堆,每次弹出堆顶最大的一个数,就不能保证题目找出频率最高的 k k k 个数,而且使用大顶堆每次要对整个堆进行排序,浪费时间。如果是使用小顶堆,每次仅保留 k k k 个频率最高的元素在堆里面,就需要只对 k k k 个元素进行排序,节省时间开销。

class Solution {
public:// 小顶堆class mycomparison{public:bool operator() (const pair<int, int>& lhs, const pair<int, int>& rhs) {return lhs.second > rhs.second;}};vector<int> topKFrequent(vector<int>& nums, int k) {unordered_map<int, int> mp; // <元素,频率>for (int c: nums) mp[c] ++ ;priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que; // 小顶堆for (auto it = mp.begin(); it != mp.end(); it ++ ) {pri_que.push(*it);if (pri_que.size() > k) pri_que.pop();}vector<int> res(k);for (int i = k - 1; i >= 0; i -- )res[i] = pri_que.top().first, pri_que.pop();return res;}
};

相关文章:

第五章 栈与队列

目录 一、用栈实现队列二、用队列实现栈三、有效的括号四、删除字符串中的所有相邻重复项五、逆波兰表达式求值六、滑动窗口最大值七、前 K 个高频元素 一、用栈实现队列 Leetcode 232 class MyQueue { public:stack<int> in, out;MyQueue() {}void push(int x) {in.pu…...

PyQt5桌面应用开发(16):定制化控件-QPainter绘图

本文目录 PyQt5桌面应用系列画画图&#xff0c;喝喝茶QPainter和QPixmapQPixmapQPainter绘制事件 一个魔改的QLabelCanvas类主窗口主程序&#xff1a; 总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2…...

spring5源码篇(9)——mybatis-spring整合原理

spring-framework 版本&#xff1a;v5.3.19 spring和mybatis的整合无非主要就是以下几个方面&#xff1a; 1、SqlSessionFactory怎么注入&#xff1f; 2、Mapper代理怎么注入&#xff1f; 3、为什么要接管mybatis事务&#xff1f; 文章目录 一、SqlSessionFactory怎么注入SqlSe…...

为什么需要防雷接地,防雷接地的作用是什么

为什么需要电气接地&#xff1f; 您是否曾经在工作条件下使用任何电器时接触过电击&#xff1f;几乎每个人的答案都是肯定的&#xff0c;有时这些电击是轻微的&#xff0c;但有时会对电气和电子设备造成损坏&#xff0c;并可能危及生命。为防止对人的生命和电器造成任何损害&a…...

如何应用金字塔模型提高结构化表达能力

看一下结构化表达的定义&#xff1a; 结构化表达&#xff1a;是基于结构化思维&#xff0c;理清事物整理与部分之间关系、换位思考后&#xff0c;进行简洁、清晰和有信服力的表达&#xff0c;是一种让受众听得明白、记得清楚、产生认同的精益沟通方式。 结构化表达的基本原则是…...

2023年系统分析师考前几页纸

企业战略规划是用机会和威胁评价现在和未来的环境,用优势和劣势评价企业现状,进而选择和确定企业的总体和长远目标,制定和抉择实现目标的行动方案。信息系统战略规划关注的是如何通过该信息系统来支撑业务流程的运作,进而实现企业的关键业务目标,其重点在于对信息系统远景…...

openwrt-安装NGINX

openwrt-安装NGINX 介绍 OpenWrt 是一个用于嵌入式设备的开源操作系统。它基于 Linux 内核&#xff0c;并且主要被设计用于路由器和网络设备。 OpenWrt 的主要特点包括&#xff1a; 完全可定制&#xff1a;OpenWrt 提供了一个完全可写的文件系统&#xff0c;用户可以自定义设…...

Linux安装MongoDB数据库并内网穿透在外远程访问

文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 转发自CSDN cpolarlisa的文章&#xff1a;Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透…...

flutter系列之:使用AnimationController来控制动画效果

文章目录 简介构建一个要动画的widget让图像动起来总结 简介 之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动画效果&#xff0c;但是要完全实现自定义的复杂的动画效果&#xff0c;还是要使用AnimationController。 今天我…...

golang 函数调用栈笔记

一个被函数在栈上的情况&#xff1a;&#xff08;栈从高地址向低地址延伸&#xff09; 返回地址&#xff08;函数执行结束后&#xff0c;会跳转到这个地址执行&#xff09; BP&#xff08;函数的栈基&#xff09;局部变量返回值&#xff08;指的是函数返回值&#xff0c;eg&am…...

云端一体助力体验升级和业务创新

随着音视频和AI技术的发展&#xff0c;在满足用户基础体验和需求情况下&#xff0c;更极致的用户体验和更丰富的互动玩法&#xff0c;成为各个平台打造核心竞争力的关键。LiveVideoStackCon 2022 北京站邀请到火山引擎视频云华南区业务负责人——张培垒&#xff0c;基于节跳动音…...

【Linux Network】高级IO

目录 前言 五种IO模型 阻塞IO 非阻塞IO 信号驱动IO IO多路转接 异步IO 小结 同步通信 vs 异步通信 阻塞 vs 非阻塞 其他高级IO 非阻塞IO fcntl函数 代码测试 高级IO&#x1f337; 前言 IO&#xff1a;所谓的I便是 input&#xff0c;所谓的O便是 output&#xff0c;简单点来说&a…...

Python语言基本控制结构

Python语言基本控制结构包括&#xff1a;条件语句&#xff1a;if、elif、else 循环语句&#xff1a;for、while 跳转语句&#xff1a;break、continue、return 下面是它们的基本用法&#xff1a; 条件语句 if condition1: statement1 elif condition2: statement2 else: stat…...

旅游网站版面设计方案

门户网站的页面设计&#xff1a;采用天蓝色为主色调、以红色、绿色为基调&#xff0c;突出网站的青春活波性。 网站风格尽量简单统一、容易让大多数上网者接受&#xff0c;个性化的网站&#xff0c;再者&#xff0c;网站有主体信息结构及布 word . . . . 局&#xff0c;它是总体…...

sudo unable to open read-only file system”的原因

此错误是由多种原因引起的&#xff0c;包括&#xff1a; 文件系统不一致。文件系统配置错误&#xff08;/etc/fstab 文件中的错误条目&#xff09;。由于各种原因&#xff08;包括突然断电或电缆损坏&#xff09;导致系统意外或突然关闭。在某些情况下&#xff0c;Windows 的双…...

Dynamics 365 DevOps CI/CD之WebResource

对于D365自身的发布&#xff0c;简单点来说就是Solution的发布&#xff0c;复杂一些会涉及周边集成接口等一系列的发布。如果是单纯的Solution的发布的Azure DevOps商店里有很多工具&#xff0c;比如Power DevOps Tools&#xff0c;这个我之前也有博文转载过相关文章&#xff0…...

Linux常用指令及基础配置

Linux常用指令及基础配置 Linux系统操作指令文件管理指令系统设置相关指令addr2line的运用 vim相关vim配置操作Vim功能操作分屏擦操作删除操作换行符转换操作&#xff1a;文件比较合并操作折叠指令 Linux系统操作指令 文件管理指令 find ./ -iname filename find ./ -name “…...

Linux 服务器上Nvidia相关指令

1、GPU驱动的内存常驻模式 1&#xff09;操作命令: 确保你具有root或sudo权限&#xff0c;以执行下面的命令。打开终端或命令行界面。运行以下命令来设置GPU驱动的内存常驻模式&#xff1a; nvidia-smi -pm 1这会将GPU驱动程序设置为内存常驻模式。 4. 验证设置是否成功。运…...

ChatGPT的工作原理是什么?

ChatGPT是美国OpenAI研发的聊天机器人程序&#xff0c;2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来进行对话。 ChatGPT的原理 ChatGPT是一种基于人工智能技术的自然语言生成模型&#xff0c;它能够从大量…...

C++进阶——红黑树

C进阶——红黑树 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出俩 倍&…...

四旋翼变形控制:RL与MPC在混合动力学中的对比

1. 四旋翼变形控制的技术挑战与解决方案四旋翼变形控制&#xff08;Quadrotor Morpho-Transition&#xff09;是当前机器人领域最具挑战性的前沿技术之一。这项技术使机器人能够在空中完成形态变换&#xff0c;实现从飞行模式到地面模式的平滑切换。想象一下&#xff0c;一架四…...

Allegro等长设置翻车实录:拓扑模板法的3个坑与手工PinPair的救赎

Allegro等长设计避坑指南&#xff1a;从拓扑模板到精准PinPair的实战演进在高速PCB设计中&#xff0c;等长匹配如同精密钟表里的齿轮啮合&#xff0c;差之毫厘便可能导致整个系统时序崩塌。当设计从简单的点对点结构升级到多负载复杂拓扑时&#xff0c;Allegro用户常陷入两种典…...

如何删除论文脚注横线的方法——视图-草稿-引用——显示备注——删除脚注分隔符-即可。

如何删除论文脚注横线的方法——视图-草稿-引用——显示备注——删除脚注分隔符-即可。 Word中脚注线不会删&#xff1f;这里有妙招&#xff01;,教育,职业教育,好看视频...

古戏台构件声学特性的时域有限差分方法【附模型】

✨ 长期致力于时域有限差分法、窑洞、戏台、八字墙、共形技术研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;曲面共形网格快速生成算法&#xff1a; …...

Blender渲染通道完全指南:如何像电影后期一样,分离出深度、阴影与反射图

Blender渲染通道完全指南&#xff1a;影视级后期制作的深度解析在数字内容创作领域&#xff0c;Blender已经从一个简单的3D建模工具成长为能够处理复杂视觉特效的全流程解决方案。对于追求影视级质量的中高级用户而言&#xff0c;掌握渲染通道技术是提升作品专业度的关键一步。…...

告别道路预测老套路:用ParkPredict+模型思路,解决停车场里的‘鬼探头’难题

破解泊车场景预测困局&#xff1a;ParkPredict模型的技术革新与实践停车场里的每一次转向、倒车和避让&#xff0c;都是对自动驾驶系统预测能力的极限挑战。与开放道路的规则明确不同&#xff0c;这里没有清晰的车道线指引&#xff0c;没有统一的行驶方向&#xff0c;只有随时可…...

Python PIL 画矩形框

基础代码 from PIL import Image, ImageDraw# 打开图片 img Image.open(your_image.jpg)# 创建绘图对象 draw ImageDraw.Draw(img)# 矩形坐标 (x1, y1, x2, y2) coords (23, 21, 69, 76)# 画矩形框&#xff08;红色&#xff0c;线宽2&#xff09; draw.rectangle(coords, ou…...

基于可解释机器学习的城市人口流动空间降尺度分析实践

1. 项目概述&#xff1a;从宏观到微观&#xff0c;解码城市脉搏在城市的肌理中&#xff0c;人口的流动如同血液的循环&#xff0c;承载着经济活力、社会互动与空间结构的全部信息。无论是城市规划师优化公交线路&#xff0c;还是商业分析师评估店铺选址&#xff0c;亦或是公共卫…...

【DeepSeek架构评审功能深度解密】:20年架构师亲授3大避坑指南与5步落地 checklist

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek架构评审功能全景概览 DeepSeek架构评审功能是一套面向大模型系统设计与工程落地的自动化分析框架&#xff0c;聚焦于模型结构合理性、计算图优化潜力、内存访问模式、算子兼容性及部署约束等多维度评…...

独立站内容分层:一层给 SEO,一层给 GEO

你的内容在喂两个完全不同的"阅读者" 你的博客文章&#xff0c;从来都不只有一个读者。 传统认知里&#xff0c;独立站内容的读者只有两类&#xff1a;真人访客和搜索引擎爬虫。SEO 优化的一切工作&#xff0c;本质上都是在讨好后者&#xff0c;顺带服务前者。 但…...