【C++】---Stack和Queue的用法及其模拟实现
文章目录
- Stack
- 最小栈
- 栈的弹出压入序列
- 逆波兰表达式求值
- 用栈实现队列
- 模拟实现
- queue
- 用队列实现栈
- 模拟实现
Stack
stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的vector等容器类似,都具有插入、删除、判空功能,具体的实现就做几道OJ题来感受一下,也可以查看文档进行了解。
最小栈

因为栈的性质是后进先出,所以可以利用这个性质。首先创建两个栈,一个用于压栈(s1),一个用于记录较小元素的栈(s2)。首先每一次压栈s1都会将元素保存,如果s2栈顶的元素比最近压栈的元素大或者当s2为空时,则s2将元素入栈。这样操作就能保持每一次s2里面最近一次进栈的元素都是以压栈元素中最小的元素,此时我们只需要每次取出s2栈顶的元素就是最小元素。如果s1进行出栈操作,那么如果s2的栈顶元素等于s1出栈的元素,那么s2也要进行出栈,这样才能保持住s2的栈顶元素是最小的。
class MinStack {
public:MinStack() {}void push(int val) {s1.push(val);if(s2.empty() || s2.top() >= val)s2.push(val);}void pop() {if(s1.top() == s2.top())s2.pop();s1.pop();}int top() {return s1.top();}int getMin() {return s2.top();}private:stack<int> s1;stack<int> s2;};
栈的弹出压入序列

这道题考验的就是我们对于后进先出性质的应用,首先一定得判断一下两个序列的长度是否一样,如果不一样那就肯定不对了。接着我们可以对入栈序列进行依次入栈,每一次入栈的元素都和出栈序列的元素比较,如果相等那么出栈序列的比较元素就往后一个,刚入栈的元素就出栈。这样依次反复循环如果栈里的元素全部出栈完并且此时出栈序列所有元素都比较完即为匹配成功。反之其他情况匹配失败
class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {if(pushV.size() != popV.size())return false;//创建栈和记录两个序列的比较个数int out = 0;int in = 0;stack<int> s;//如果出栈序列比较完即推出训话while(out < popV.size()){//如果栈为空或者栈顶元素不等于出栈序列的比较元素则继续入栈while(s.empty() || s.top() != popV[out]){if(in < pushV.size())s.push(pushV[in++]);//如果全部元素都入栈但出栈序列没有比较完则匹配失败elsereturn false;}//如果栈顶元素等于出栈序列比较元素则出栈s.pop();++out;}return true;}
};
逆波兰表达式求值

逆波兰表达式简单理解就是将运算符放到运算数的后面,因此这道题可以使用栈来完成。首先如果遇到数字就入栈,遇到运算符就不用入栈了,用两个变量来接受栈的两个元素进行运算之后再把结果入栈,这样每一次的运算结果都是栈顶元素,依次循环直至结束。此时栈顶的元素就是最后的运算结果。
class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for (auto e : tokens) {if (e == "+" || e == "*" || e == "-" || e == "/") {int right = st.top();st.pop();int left = st.top();st.pop();switch (e[0]) {case '+':st.push(left + right);break;case '-':st.push(left - right);break;case '*':st.push(left * right);break;case '/':st.push(left / right);break;}}else//需要将字符串转为整型才可以入栈st.push(stoi(e));}return st.top();}
};
用栈实现队列

这道题如果用C语言写就十分的不方便,什么都得自己造。但是用C++有了STL之后就十分的轻松。思路很简单,用两个栈实现队列的先进先出性质。
class MyQueue {
public:MyQueue() {}void push(int x) {ins.push(x);}int pop() {if(outs.empty()){while (!ins.empty()) {outs.push(ins.top());ins.pop();}}int x = outs.top();outs.pop();return x;}int peek() {if(outs.empty()){while (!ins.empty()) {outs.push(ins.top());ins.pop();}}int x = outs.top();return x; }bool empty() {return ins.empty() && outs.empty();}private:stack<int> outs;stack<int> ins;
};
模拟实现
stack其实是一种适配器设计模式,它的接口实现和vector非常的相像,因此我们可以直接使用vector去实现stack
#pragma once#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<stack>
using namespace std;namespace my {template<class T, class con = vector<T>>class stack {public:void push(const T& x) {_con.push_back(x);}void pop() {_con.pop_back();}const T& top() {return _con.back();}bool empty() {return _con.empty();}private:con _con;};
}
queue
队列和栈其实都是一样的接口和功能,不同的是队列是一种先进先出的容器,和栈刚好相反。还有就是栈的底层是数组而队列的底层是链表,因此queue多了返回队头和队尾的接口。
用队列实现栈

这个和上面的用栈实现队列是一样的,都是为了模拟出各自的性质,所以这里也可以用两个队列去实现。
class MyStack {
public:MyStack() {}void push(int x) {//元素先入第二个队列,保证最先入队列的元素在队头q2.push(x);//将原队列的所有元素依次入第二个队列,保证队列结构//再进行交换while(!q1.empty()){q2.push(q1.front());q1.pop();}swap(q1, q2);}int pop() {int x = q1.front();q1.pop();return x;}int top() {return q1.front();}bool empty() {return q1.empty();}private:queue<int> q1;queue<int> q2;};
模拟实现
queue也是一种适配器设计模式,所以也可以用已有的容器去实现它,因为queue的底层实现是链表,所以我们用list去实现
#pragma once#include"stack.h"namespace my2 {template<class T, class con = list<T>>class queue {public:void push(const T& x) {_con.push_back(x);}void pop() {_con.pop_front();}const T& top() {return _con.front();}bool empty() {return _con.empty();}private:con _con;};
}
相关文章:
【C++】---Stack和Queue的用法及其模拟实现
文章目录Stack最小栈栈的弹出压入序列逆波兰表达式求值用栈实现队列模拟实现queue用队列实现栈模拟实现Stack stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的ve…...
Python GUI编程
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8…...
2023年浙江水利水电施工安全员精选真题题库及答案
百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…...
Solon2 开发之插件,三、插件体外扩展机制(E-Spi)
插件体外扩展机制,简称:E-Spi。用于解决 fatjar 模式部署时的扩展需求。比如: 把一些“业务模块”做成插件包放到体外把数据源配置文件放到体外,方便后续修改 其中, .properties 或 .yml 文件都会做为扩展配置加载&a…...
数据结构与算法(Java版) | 数据结构与算法的关系
从这一节起,咱们就要开始进入到「第二章——数据结构与算法的介绍」的学习中了,总的来说,第二章要讲解的内容其实也不是特别的多,内容也多偏理论,相信大家学起来是会比较轻松愉快的。 接下来,就请大家跟随…...
华科万维C++章节练习3_7
题目: 编程实现两种温度体系华氏温度和摄氏温度的相互转换; 以F作为华氏温度体系的单位,以C作为摄氏温度体系的单位。 要求当输入以F作为单位的温度值时(温度值范围[-500F~500F], 否则提示“数据输入有误!”)将其转换为对应的摄氏…...
CHAPTER 5 Jenkins SonarQube
Jenkins & SonarQube5.1 安装SonarQube1. 下载镜像2. 导出到其他服务器3. 准备工作4. docker-compose文件5. 启动容器5.2 登录SonarQube1.登录2. 安装中文语言插件3. 安装其他插件5.3 部署扫描器sonar-scanner1. 部署sonar-scanner2. 新建项目3. 扫描代码4. 查看报告5.4 Je…...
[AAAI 2023] Oral : Zero-shot 零样本/ Few-shot 少样本收录论文集合
零样本 (7篇): CALIP: Zero-Shot Enhancement of CLIP with Parameter-free AttentionGuo Ziyu; Zhang Renrui; Qiu Longtian; ma Xianzheng; Miao Xupeng; He Xuming; Cui BinMaximum Entropy Population-Based Training for Zero-Shot Human-AI CoordinationZhao …...
驱动开发 2.13
设备树 设备树就是一种描述硬件信息的树形结构,设备树上有很多设备节点,每一个设备节点都描述了一个硬件设备信息,设备节点中也可以再包含子设备节点和设备属性,同一个节点的不同属性是以链表结构存储,设备树有.dts设…...
【数据库】sql函数和多表关联查询
目录 一,SQL函数 1,聚合函数 1, count函数 2, AVG函数 3, SUM函数 4, MAX函数 5, MIN函数 6,数据分组——GROUP BY 7,限定组的结果,HAVING 8&#x…...
6-周赛332总结
6-周赛332总结 过了Q1和Q2,Q2知道用二分但是边界处理的不是很好,迷迷糊糊过的(手动再移动了下返回值…) Q3知道将子字符串的值取出来,将最短位置放在哈希表中,然后异或在哈希表中找值。但是我这个猪头脑袋…...
嵌入式Qt 开发一个音乐播放器
上篇文章:RK3568源码编译与交叉编译环境搭建,进行了OK3568开发板软件开发环境搭建,通过编译RK3568的源码,可以得到Qt开发的交叉编译相关工具。 本篇,就来在搭建好的软件开发中,进行Qt软件的开发测试。由于…...
2023秋招万得集团AI算法岗面经分享
本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页:秋招算法类面经分享 主要分享计算机算法类在面试互联网公司时候一些真实的经验 2022年 11.22下午AI算法岗面试 (1)一面35min 1、自我介绍 2、科研:长文本MRC...
RoI Transformer论文翻译详解
Learning RoI Transformer for Oriented Object Detection in Aerial Images 0.摘要 航空图像中的目标检测是计算机视觉中一个活跃而又具有挑战性的任务,因为它具有鸟瞰视角、高度复杂的背景和变化的物体外观。特别是在航空图像中检测密集的目标时,基于…...
Prometheus 自动发现监控AWS EC2实例
本文章简述对接自动发现AWS云EC2实例 前提环境: PromethuesGrafanaAWS IAM权限 涉及参考文档: AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则: {"Version": "2012-10-17",&quo…...
从recat源码角度看setState流程
setState setState() 将对组件 state 的更改排入队列批量推迟更新,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。其实setState实际上不是异步,只是代码执行顺序不同,有了异步的感觉。 使用方法 setState(stateChange | u…...
【Java|golang】1234. 替换子串得到平衡字符串---双指针
有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换一个子串」的方式,…...
自监督表征学习方法——BYOL(Bootstrap Your Own Latent)
自监督表征学习方法——BYOL(Bootstrap Your Own Latent) 参考文献:《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》 1.前言背景 学习良好的图像表示是计算机视觉中的一个关键挑战,因为它允许对下游任务进行有效的训练。许…...
均衡负载集群(LBC)-1
均衡负载集群(LBC) 客户–>通过Internet—>负载调度器—>n台真实服务器 负载调度器: 软件:LVS;Nginx;Haproxy硬件:F5; LVS架构: 使用到C/S(B/S…...
WebSocket
关于WebSocket: WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。 WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话…...
InspireFace实战:5分钟搞定跨平台人脸识别SDK集成(Python版)
InspireFace实战:5分钟搞定跨平台人脸识别SDK集成(Python版) 人脸识别技术正在从实验室走向日常生活,而开发者如何快速验证一个SDK的可行性往往决定了项目原型的开发效率。今天我们要探讨的InspireFace,正是一款在GitH…...
1790-2026年美国政府工作报告
美国国情咨文(State of the Union Address),是美国联邦政府向国会、民众传递施政理念、过往施政成果与未来施政规划的重要官方文件,更是反映美国不同历史时期政治、经济、社会、外交等领域发展状况的核心资料,其作用与…...
解决Seurat Error in FeaturePlot(object = seurat_object, features.plot = id, cols.use = c(“grey“,
背景说明 粉丝的问题如下: FeaturePlot 是 Seurat 包中的一个函数。 在小品文中提到,如果指定参数 do.return = TRUE,它应该返回一个 ggplot2 对象。但这并没有生效。我的目标只是更改图形的标题。对于小提琴图,我可以这样做: VlnPlot(object = seurat_object, featur…...
DAMOYOLO-S与数据库联动:构建目标检测结果管理与查询系统
DAMOYOLO-S与数据库联动:构建目标检测结果管理与查询系统 如果你用过DAMOYOLO-S这类目标检测模型,肯定遇到过这样的烦恼:模型跑得挺快,图片一张张处理,结果也出来了,但接下来呢?成百上千张图片…...
CLI-Anything 原理与实践:MCP 之外的另一种 Agent 工具接入方式
CLI-Anything 项目解析:它会替代 MCP 吗? 当大家都在讨论 AI Agent、MCP、Tool Use 的时候,一个更底层的问题其实越来越明显:AI 很会推理,却并不擅长稳定地使用真实世界的软件。 它会写代码,会拆任务,会调用 API,但一旦面对复杂桌面软件、老项目、没有完整接口的应用,…...
3D Face HRN与YOLOv8结合应用:智能视频中的人脸3D重建技术
3D Face HRN与YOLOv8结合应用:智能视频中的人脸3D重建技术 1. 引言 在智能视频分析领域,实时捕捉并重建人脸3D模型一直是个技术难点。传统方法要么速度跟不上实时需求,要么精度达不到实用标准。现在通过将3D Face HRN的高精度重建能力与YOL…...
OpenClaw健康检查:Qwen3-32B服务可用性监控与告警配置
OpenClaw健康检查:Qwen3-32B服务可用性监控与告警配置 1. 为什么需要健康检查? 去年冬天的一个深夜,我正赶着处理一批自动化文档整理任务时,突然发现OpenClaw连续三次执行失败。检查日志才发现是Qwen3-32B服务响应超时——原来是…...
Qwen3-VL:30B多模态能力实测:飞书群中识别含表格的Word截图,转为可编辑Excel结构
Qwen3-VL:30B多模态能力实测:飞书群中识别含表格的Word截图,转为可编辑Excel结构 实验说明:本文所有的部署及测试环境均由 CSDN 星图 AI 云平台提供。我们使用官方预装的 Qwen3-VL-30B 镜像作为基础环境进行二次开发。 1. 项目概述࿱…...
RePKG技术指南:Wallpaper Engine资源处理利器完全掌握
RePKG技术指南:Wallpaper Engine资源处理利器完全掌握 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 一、问题导入:当壁纸资源处理遇到挑战 你是否曾面临这…...
快速入门AI绘画:造相Z-Image文生图模型v2部署与简单调用指南
快速入门AI绘画:造相Z-Image文生图模型v2部署与简单调用指南 1. 环境准备与快速部署 1.1 系统要求 在开始部署前,请确保您的环境满足以下基本要求: GPU配置:NVIDIA显卡(推荐RTX 4090D或同级别)…...
