代码随想录笔记--栈与队列篇
目录
1--用栈实现队列
2--用队列实现栈
3--有效的括号
4--删除字符串中的所有相邻重复项
5--逆波兰表达式求值
6--滑动窗口的最大值
7--前k个高频元素
1--用栈实现队列

利用两个栈,一个是输入栈,另一个是输出栈;
#include <iostream>
#include <stack>class MyQueue {
public:MyQueue() {}void push(int x) {in_stk.push(x);}int pop() {if(out_stk.empty()){while(!in_stk.empty()){out_stk.push(in_stk.top());in_stk.pop();}}int tmp = out_stk.top();out_stk.pop();return tmp;}int peek() {if(out_stk.empty()){while(!in_stk.empty()){out_stk.push(in_stk.top());in_stk.pop();}}return out_stk.top();}bool empty() {if(out_stk.empty() && in_stk.empty()) return true;else return false;}
private:std::stack<int> in_stk, out_stk;
};int main(int argc, char* argv[]){MyQueue Queue;Queue.push(1);Queue.push(2);Queue.push(3);std::cout << Queue.pop() << std::endl;std::cout << Queue.peek() << std::endl;return 0;
}
2--用队列实现栈

主要思路:
弹出栈顶元素时,需要将队列前 size - 1 个元素先弹出再重新加入到队列中;
#include <iostream>
#include <queue>class MyStack {
public:MyStack() {}void push(int x) {q.push(x);}int pop() {int size = q.size();for(int i = 1; i <= size - 1; i++){q.push(q.front());q.pop();}int tmp = q.front();q.pop();return tmp;}int top() {int size = q.size();for(int i = 1; i <= size - 1; i++){q.push(q.front());q.pop();}int tmp = q.front();q.pop();q.push(tmp);return tmp;}bool empty() {return q.empty();}
private:std::queue<int> q;
};int main(int argc, char* argv[]){MyStack stk;stk.push(1);stk.push(2);stk.push(3);std::cout << stk.pop() << std::endl;std::cout << stk.top() << std::endl;return 0;
}
3--有效的括号

主要思路:
基于栈,遇到左括号,入栈对应的右括号。遇到右括号,判断当前栈顶元素是否与右括号相等,相等则表示之前曾遇到对应的左括号,表明匹配成功并弹出栈顶元素,否则返回 false;
最后判断栈是否为空,即是否有未匹配的左括号;
#include <iostream>
#include <stack>
#include <string>class Solution {
public:bool isValid(std::string s) {std::stack<char> stk;for(int i = 0; i < s.length(); i++){if(s[i] == '(') stk.push(')');else if(s[i] == '[') stk.push(']');else if(s[i] == '{') stk.push('}');else{if(stk.empty()) return false;else if(stk.top() != s[i]) return false;else stk.pop(); // 匹配}}return stk.empty();}
};int main(int argc, char* argv[]){std::string test = "()[]{}";Solution S1;bool res = S1.isValid(test);if(res) std::cout << "true" << std::endl;else std::cout << "false" << std::endl;return 0;
}
4--删除字符串中的所有相邻重复项

主要思路:
基于栈,遍历字符串,判断当前字符与栈顶元素是否相同,相同则弹出栈顶元素,否则入栈;
最后遍历栈,将栈内的元素重构为字符串,需注意顺序;
#include <iostream>
#include <stack>
#include <string>class Solution {
public:std::string removeDuplicates(std::string s) {std::stack<char> stk;for(int i = 0; i < s.length(); i++){if(stk.empty() || stk.top() != s[i]){stk.push(s[i]);}else{ // s[i] == stk.top()stk.pop();}}std::string res;while(!stk.empty()){res = stk.top() + res;stk.pop();}return res;}
};int main(int argc, char* argv[]){std::string test = "abbaca";Solution S1;std::string res = S1.removeDuplicates(test);std::cout << res << std::endl;return 0;
}
5--逆波兰表达式求值

主要思路:
基于栈,遍历字符串数组,当遇到数字时将数字压入栈中,当遇到运算符时,将栈顶的两个元素取出来进行运算,并将运算结果重新压入栈中;
需注意运算顺序,即第二个出栈的 num2 作为运算符的左侧元素;
#include <iostream>
#include <vector>
#include <stack>
#include <string>class Solution {
public:int evalRPN(std::vector<std::string>& tokens) {std::stack<int> stk;for(int i = 0; i < tokens.size(); i++){if(tokens[i] != "+" && tokens[i] != "-" && tokens[i] != "*" && tokens[i] != "/"){stk.push(std::stoi(tokens[i]));continue;}int num1 = stk.top();stk.pop();int num2 = stk.top();stk.pop();if(tokens[i] == "+"){ int num3 = num2 + num1;stk.push(num3);continue;}else if(tokens[i] == "-"){int num3 = num2 - num1;stk.push(num3);continue;}else if(tokens[i] == "*"){int num3 = num2 * num1;stk.push(num3);continue; }else{int num3 = num2 / num1;stk.push(num3);continue;}}return stk.top();}
};int main(int argc, char* argv[]){// tokens = ["2","1","+","3","*"]std::vector<std::string> test = {"2", "1", "+", "3", "*"};Solution S1;int res = S1.evalRPN(test);std::cout << res << std::endl;return 0;
}
6--滑动窗口的最大值

主要思路:
维护一个双端队列,队列里的元素存储的是可能成为最大值的元素,对于当前滑动窗口,其最大值为队头元素;
当移动滑动窗口时,需要判断当前移出窗口的元素是否是队头元素,如果是则需先将队头元素弹出(因为该元素已经离开了滑动窗口,相当于失效);
之前本题的解法是存储元素的索引(之前的解法),这样可以避免重复元素的出现;但现在本题的解法是存储元素,所以一个细节是需要避免错误移除重复元素的问题,具体可以推导例子:[-7,-8,7,5,7,1,6,0];
#include <iostream>
#include <vector>
#include <queue>class Solution {
public:std::vector<int> maxSlidingWindow(std::vector<int>& nums, int k) {std::deque<int> q; // 存储可能成为最大值的元素std::vector<int> res;// 初始化第一个滑动窗口for(int i = 0; i < k; i++){// 不能取等于号的原因是可能会出现相等的数,例如下例// [-7,-8,7,5,7,1,6,0] 出现了两个7,取=号会误弹出第2个7while(!q.empty() && q.back() < nums[i]){q.pop_back();}q.push_back(nums[i]);}res.push_back(q.front());// 遍历更新for(int i = k; i < nums.size(); i++){// 移除滑动窗口左边界的元素if(nums[i-k] == q.front()) q.pop_front();// 把不可能成为最大值的元素从队列中移出while(!q.empty() && q.back() < nums[i]){q.pop_back();}q.push_back(nums[i]);res.push_back(q.front()); // 记录当前滑动窗口的最大值}return res;}
};int main(int argc, char* argv[]){std::vector<int> test = {1, 3, -1, -3, 5, 3, 6, 7};int k = 3;Solution S1;std::vector<int> res = S1.maxSlidingWindow(test, k);for(auto v : res) std::cout << v << " ";std::cout << std::endl;return 0;
}
7--前k个高频元素

主要思路:
维护一个优先队列(小顶堆),里面存储 k 个元素及其出现的次数;
#include <iostream>
#include <vector>
#include <map>
#include <queue>class Solution {
public:std::vector<int> topKFrequent(std::vector<int>& nums, int k) {std::map<int, int> m;for(int i = 0; i < nums.size(); i++){m[nums[i]] += 1;}// 小顶堆std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, mycompare> pri_q;for(auto it = m.begin(); it != m.end(); it++){pri_q.emplace(*it);if(pri_q.size() > k) pri_q.pop(); // 始终维护 k 个 pair 对}// 倒叙输出k个高频元素std::vector<int> res(pri_q.size(), 0);for(int i = pri_q.size() - 1; i>=0; i--){res[i] = pri_q.top().first;pri_q.pop();}return res;}class mycompare{public:bool operator()(std::pair<int, int>& item1, std::pair<int, int>& item2){return item1.second > item2.second;}};
};int main(int argc, char* argv[]){// nums = [1,1,1,2,2,3], k = 2std::vector<int> test = {1, 1, 1, 2, 2, 3};int k = 2;Solution S1;std::vector<int> res = S1.topKFrequent(test, k);for(auto item : res) std::cout << item << " ";std::cout << std::endl;return 0;
}
相关文章:
代码随想录笔记--栈与队列篇
目录 1--用栈实现队列 2--用队列实现栈 3--有效的括号 4--删除字符串中的所有相邻重复项 5--逆波兰表达式求值 6--滑动窗口的最大值 7--前k个高频元素 1--用栈实现队列 利用两个栈,一个是输入栈,另一个是输出栈; #include <iostrea…...
【力扣】55. 跳跃游戏 <贪心>
【力扣】55. 跳跃游戏 给一个非负整数数组 nums ,最初位于数组的第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1…...
在iPhone 15发布之前,iPhone在智能手机出货量上占据主导地位,这对安卓来说是个坏消息
可以说这是一记重拳,但似乎没有一个有价值的竞争者能与苹果今年迄今为止的智能手机出货量相媲美。 事实上,根据Omdia智能手机型号市场跟踪机构收集的数据,苹果的iPhone占据了前四名。位居榜首的是iPhone 14 Pro Max,2023年上半年…...
题目:2620.计数器
题目来源: leetcode题目,网址:2620. 计数器 - 力扣(LeetCode) 解题思路: 定义两个全局变量,一个判断 n 是否改变,另一个记录上一次出现的数。 解题代码: /*** par…...
【MySQL】MySQL系统变量(system variables)列表(SHOW VARIABLES 的结果例)
文章目录 【MySQL】MySQL系统变量(system variables)列表(SHOW VARIABLES 的结果例)SHOW VARIABLES 的结果例参考 【免责声明】文章仅供学习交流,观点代表个人,与任何公司无关。 编辑|SQL和数据库技术(ID:S…...
【多AZ】浅述云计算多az
多AZ(Availability Zone)是云计算中一种重要的容灾和冗余策略,它通过在不同的地理位置或不同的设备上存储数据副本以及网络切换策略,以保证在单个设备或地理位置发生故障时,云加计算集群仍然能够提供服务。 多AZ的特点…...
Element浅尝辄止13:Collapse 折叠面板
通过折叠面板收纳内容区域 1.如何使用? 可同时展开多个面板,面板之间不影响 <el-collapse v-model"activeNames" change"handleChange"><el-collapse-item title"一致性 Consistency" name"1">&l…...
51 单片机包含头文件 BIN51.H 直接写二进制数字
51 单片机包含头文件 BIN51.H 直接写二进制 最近学习 51 单片机,写代码的时候感觉用二进制的形式更直观。就是每次都需要宏定义,太麻烦。干脆把所有的8位二进制数字全部用宏定义写出来,放进头文件,下次使用直接包含头文件就行。 …...
php环境搭建步骤(与资源配套使用版)
1.将phpEnv.zip下载到D盘下 2.解压到当前文件夹 3.找到Apache24下的bin目录,执行cmd操作,回车。 4.在cmd中执行代码 Httpd -k install -n “Apache24” 4.使用winR键打开运行,输入services.msc ,回车,进入服务 …...
java 集合处理:
// 1 数组转map public static void main(String[] args) {String backendIdStr"[\"backend-mvj05upv7yc\",\"backend-mvj055qvric\",\"backend-mvj04hlutx4\"]";String[] backendIdList JsonUtil.asObject(backendIdStr, String[].c…...
算法训练第五十二天
718. 最长重复子数组 - 力扣(LeetCode) class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {vector<vector<int>> dp(nums1.size() 1,vector<int>(nums2.size() 1,0));int res…...
LeetCode——回溯篇(三)
刷题顺序及思路来源于代码随想录,网站地址:https://programmercarl.com 目录 46. 全排列 47. 全排列 II 332. 重新安排行程 51. N 皇后 37. 解数独 46. 全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任…...
Python爬取京东商品评论
寻找数据真实接口 打开京东商品网址查看商品评价。我们点击评论翻页,发现网址未发生变化,说明该网页是动态网页。 API名称:item_review-获得JD商品评论 公共参数 获取API测试key&secret 名称类型必须描述keyString是调用keyÿ…...
ROS机器人编程---------(一)安装ROS
安装ROS 打开终端按顺序执行下面命令 默认安装在/opt/ros路径下 打开一个终端输入roscore 测试是否安装成功 启动ROS Master roscore启动小海龟仿真器 rosrun turtlesim turtlesim_node启动海龟控制结点 rosrun turtlesim turtlesim_teleop_key使用键盘方向键控…...
Maven入门教程(一):安装Maven环境
视频教程:Maven保姆级教程 Maven入门教程(一):安装Maven环境 Maven入门教程(二):idea/Eclipse使用Maven Maven入门教程(三):Maven语法 Maven入门教程(四):Nexus私服 Maven入门教程(五):自定义脚手架 Maven项…...
CSS中可继承与不可继承属性
可继承 1. 字体属性: font、font-style、font-variant、font-weight、font-size、line-height等属性是字体样式的属性,都可以被子元素继承。 2. 文本属性: color、text-indent、text-align、text-decoration、text-transform、letter-spa…...
Vscode画流程图
1.下载插件 Draw.id Integration 2.桌面新建文件,后缀名改为XXX.drawio 在vscode打开此文件 ,就可以进行绘制流程图啦...
【K8S系列】深入解析k8s网络插件—Cilium
序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记论点蓝色:用来标记论点 在现代容器化应用程序的世界中…...
OpenCV(十六):高斯图像金字塔
目录 1.高斯图像金字塔原理 2.高斯图像金字塔实现 1.高斯图像金字塔原理 高斯图像金字塔是一种用于多尺度图像表示和处理的重要技术。它通过对图像进行多次高斯模糊和下采样操作来生成不同分辨率的图像层级,每个层级都是原始图像的模糊和降采样版本。 以下是高斯…...
Nginx配置及优化3
Nginx配置及优化3 一、网页状态页二、nginx第三方模块2.1、echo模块 三、变量3.1、内置变量3.1.1、常用的内置变量3.1.2、举个例子 3.2、自定义变量 四、自定义访问日志优化4.1、自定义访问日志的格式4.2、自定义json格式日志 五、nginx压缩功能六、HTTPS功能6.1、nginx的HTTPS…...
春联生成模型快速上手:输入‘幸福‘、‘平安‘等关键词,自动生成对仗工联
春联生成模型快速上手:输入幸福、平安等关键词,自动生成对仗工联 1. 春联生成器简介 春节贴春联是中国人延续千年的传统习俗,但创作一副对仗工整、寓意吉祥的春联并不容易。现在,借助AI技术,任何人都能轻松生成专业水…...
M2LOrder模型Python爬虫实战:应对动态渲染与数据加密网站
M2LOrder模型Python爬虫实战:应对动态渲染与数据加密网站 最近有个朋友找我帮忙,说他们公司需要从某个网站上抓取一些商品数据,但试了好几个爬虫工具都搞不定。我一看,好家伙,这网站不仅数据是页面加载完才动态生成的…...
intv_ai_mk11GPU利用率提升:Llama中型模型批处理与并发请求调优方案
intv_ai_mk11 GPU利用率提升:Llama中型模型批处理与并发请求调优方案 1. 背景与挑战 intv_ai_mk11 是基于 Llama 架构的中等规模文本生成模型,在实际部署中我们发现单请求处理时GPU利用率往往不足30%。这种低效的资源使用导致两个主要问题:…...
解锁AI编程效率:6个Continue插件实战技巧让开发效率提升10倍
解锁AI编程效率:6个Continue插件实战技巧让开发效率提升10倍 【免费下载链接】continue ⏩ Source-controlled AI checks, enforceable in CI. Powered by the open-source Continue CLI 项目地址: https://gitcode.com/GitHub_Trending/co/continue 作为一名…...
AI算力网络抉择:深度剖析RoCE与InfiniBand的实战选型指南
1. 为什么AI算力网络需要RDMA技术? 当你看到大模型训练任务卡在99%进度条时,那种焦灼感我深有体会。去年我们团队在调试千卡集群时就遇到过这种情况——原本预计72小时完成的训练任务,因为网络延迟问题硬是拖了整整一周。这就是为什么现在所…...
智慧园区能源管理系统解决方案
某园区集成生产、办公、生活三大功能,建设有生产厂房、化学品库、辅助用房、气罐站、研发楼、综合楼及其他配套设施,涉及到多种用能,包含电能、天然气、压缩空气、冷热能等,带来日益高昂的能耗成本与能源浪费隐患。 1、制冷空调监…...
Pixel Couplet Gen效果展示:抽象门神像素方块+动态卷轴交互演示
Pixel Couplet Gen效果展示:抽象门神像素方块动态卷轴交互演示 1. 项目概览 Pixel Couplet Gen是一款融合传统春节文化与现代像素艺术风格的AI春联生成器。通过ModelScope大模型驱动,将传统春联创作转化为充满游戏感的数字体验。 核心特点:…...
解锁知识:9种突破信息壁垒的创新方案
解锁知识:9种突破信息壁垒的创新方案 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的数字时代,高效的"信息获取"与"资源解锁"…...
WarcraftHelper:让魔兽争霸3重获新生的兼容性增强工具
WarcraftHelper:让魔兽争霸3重获新生的兼容性增强工具 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否曾在现代电脑上尝试重温魔兽争…...
鸿蒙 ArkTS 高级样式复用:@Extend 装饰器完全解析(比 @Styles 更强大)
🔥前言:在上一篇文章《鸿蒙 ArkTS 样式复用:Styles 装饰器从入门到实战》中,我们学习了使用 Styles 实现基础样式复用。 但 Styles 不支持传参、不能使用组件专有属性,在复杂 UI 场景下能力有限。 📌 本文…...
