代码随想录笔记--栈与队列篇
目录
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…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果