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

【C++】---Stack和Queue的用法及其模拟实现

文章目录

  • Stack
    • 最小栈
    • 栈的弹出压入序列
    • 逆波兰表达式求值
    • 用栈实现队列
    • 模拟实现
  • queue
    • 用队列实现栈
    • 模拟实现

Stack

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的vector等容器类似,都具有插入、删除、判空功能,具体的实现就做几道OJ题来感受一下,也可以查看文档进行了解。

最小栈

image-20230213193037356

因为栈的性质是后进先出,所以可以利用这个性质。首先创建两个栈,一个用于压栈(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;};

栈的弹出压入序列

image-20230213194455821

这道题考验的就是我们对于后进先出性质的应用,首先一定得判断一下两个序列的长度是否一样,如果不一样那就肯定不对了。接着我们可以对入栈序列进行依次入栈,每一次入栈的元素都和出栈序列的元素比较,如果相等那么出栈序列的比较元素就往后一个,刚入栈的元素就出栈。这样依次反复循环如果栈里的元素全部出栈完并且此时出栈序列所有元素都比较完即为匹配成功。反之其他情况匹配失败

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;}
};

逆波兰表达式求值

image-20230213200705721

逆波兰表达式简单理解就是将运算符放到运算数的后面,因此这道题可以使用栈来完成。首先如果遇到数字就入栈,遇到运算符就不用入栈了,用两个变量来接受栈的两个元素进行运算之后再把结果入栈,这样每一次的运算结果都是栈顶元素,依次循环直至结束。此时栈顶的元素就是最后的运算结果。

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();}
};

用栈实现队列

image-20230213203053798

这道题如果用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多了返回队头和队尾的接口。

用队列实现栈

image-20230213205546685

这个和上面的用栈实现队列是一样的,都是为了模拟出各自的性质,所以这里也可以用两个队列去实现。

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是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的ve…...

Python GUI编程

Python 提供了多个图形开发界面的库&#xff0c;几个常用 Python GUI 库如下&#xff1a; Tkinter&#xff1a; Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8…...

2023年浙江水利水电施工安全员精选真题题库及答案

百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…...

Solon2 开发之插件,三、插件体外扩展机制(E-Spi)

插件体外扩展机制&#xff0c;简称&#xff1a;E-Spi。用于解决 fatjar 模式部署时的扩展需求。比如&#xff1a; 把一些“业务模块”做成插件包放到体外把数据源配置文件放到体外&#xff0c;方便后续修改 其中&#xff0c; .properties 或 .yml 文件都会做为扩展配置加载&a…...

数据结构与算法(Java版) | 数据结构与算法的关系

从这一节起&#xff0c;咱们就要开始进入到「第二章——数据结构与算法的介绍」的学习中了&#xff0c;总的来说&#xff0c;第二章要讲解的内容其实也不是特别的多&#xff0c;内容也多偏理论&#xff0c;相信大家学起来是会比较轻松愉快的。 接下来&#xff0c;就请大家跟随…...

华科万维C++章节练习3_7

题目&#xff1a; 编程实现两种温度体系华氏温度和摄氏温度的相互转换; 以F作为华氏温度体系的单位&#xff0c;以C作为摄氏温度体系的单位。 要求当输入以F作为单位的温度值时(温度值范围[-500F~500F]&#xff0c; 否则提示“数据输入有误!”&#xff09;将其转换为对应的摄氏…...

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篇)&#xff1a; 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

设备树 设备树就是一种描述硬件信息的树形结构&#xff0c;设备树上有很多设备节点&#xff0c;每一个设备节点都描述了一个硬件设备信息&#xff0c;设备节点中也可以再包含子设备节点和设备属性&#xff0c;同一个节点的不同属性是以链表结构存储&#xff0c;设备树有.dts设…...

【数据库】sql函数和多表关联查询

目录 一&#xff0c;SQL函数 1&#xff0c;聚合函数 1&#xff0c; count函数 2&#xff0c; AVG函数 3&#xff0c; SUM函数 4&#xff0c; MAX函数 5&#xff0c; MIN函数 6&#xff0c;数据分组——GROUP BY 7&#xff0c;限定组的结果&#xff0c;HAVING 8&#x…...

6-周赛332总结

6-周赛332总结 过了Q1和Q2&#xff0c;Q2知道用二分但是边界处理的不是很好&#xff0c;迷迷糊糊过的&#xff08;手动再移动了下返回值…&#xff09; Q3知道将子字符串的值取出来&#xff0c;将最短位置放在哈希表中&#xff0c;然后异或在哈希表中找值。但是我这个猪头脑袋…...

嵌入式Qt 开发一个音乐播放器

上篇文章&#xff1a;RK3568源码编译与交叉编译环境搭建&#xff0c;进行了OK3568开发板软件开发环境搭建&#xff0c;通过编译RK3568的源码&#xff0c;可以得到Qt开发的交叉编译相关工具。 本篇&#xff0c;就来在搭建好的软件开发中&#xff0c;进行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.摘要 航空图像中的目标检测是计算机视觉中一个活跃而又具有挑战性的任务&#xff0c;因为它具有鸟瞰视角、高度复杂的背景和变化的物体外观。特别是在航空图像中检测密集的目标时&#xff0c;基于…...

Prometheus 自动发现监控AWS EC2实例

本文章简述对接自动发现AWS云EC2实例 前提环境&#xff1a; PromethuesGrafanaAWS IAM权限 涉及参考文档&#xff1a; AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则&#xff1a; {"Version": "2012-10-17",&quo…...

从recat源码角度看setState流程

setState setState() 将对组件 state 的更改排入队列批量推迟更新&#xff0c;并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。其实setState实际上不是异步&#xff0c;只是代码执行顺序不同&#xff0c;有了异步的感觉。 使用方法 setState(stateChange | u…...

【Java|golang】1234. 替换子串得到平衡字符串---双指针

有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符&#xff0c;且长度为 n 的字符串。 假如在该字符串中&#xff0c;这四个字符都恰好出现 n/4 次&#xff0c;那么它就是一个「平衡字符串」。 给你一个这样的字符串 s&#xff0c;请通过「替换一个子串」的方式&#xff0c;…...

自监督表征学习方法——BYOL(Bootstrap Your Own Latent)

自监督表征学习方法——BYOL(Bootstrap Your Own Latent) 参考文献&#xff1a;《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》 1.前言背景 学习良好的图像表示是计算机视觉中的一个关键挑战&#xff0c;因为它允许对下游任务进行有效的训练。许…...

均衡负载集群(LBC)-1

均衡负载集群&#xff08;LBC&#xff09; 客户–>通过Internet—>负载调度器—>n台真实服务器 负载调度器&#xff1a; 软件&#xff1a;LVS&#xff1b;Nginx&#xff1b;Haproxy硬件&#xff1a;F5&#xff1b; LVS架构&#xff1a; 使用到C/S&#xff08;B/S…...

WebSocket

关于WebSocket&#xff1a; WebSocket 协议在2008年诞生&#xff0c;2011年成为国际标准。现在所有浏览器都已经支持了。 WebSocket 的最大特点就是&#xff0c;服务器可以主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息&#xff0c;是真正的双向平等对话…...

OpenClaw安全指南:百川2-13B模型权限管控与敏感操作防护

OpenClaw安全指南&#xff1a;百川2-13B模型权限管控与敏感操作防护 1. 为什么需要安全防护机制 去年冬天的一个深夜&#xff0c;我的OpenClaw经历了一次"惊魂时刻"。当时我让AI助手整理财务表格&#xff0c;结果它误将包含个人银行账号的临时文件上传到了云存储。…...

CasRel开源大模型部署教程:一键拉取镜像+5分钟完成SPO推理

CasRel开源大模型部署教程&#xff1a;一键拉取镜像5分钟完成SPO推理 1. 什么是CasRel关系抽取模型 如果你需要从大段文字中自动找出"谁做了什么"、"谁是什么"这样的信息&#xff0c;CasRel模型就是你的得力助手。这个模型专门用来从文本中提取主体-谓语…...

拓扑优化避坑指南:SIMP算法在MATLAB里跑不收敛?可能是这5个参数没调对

SIMP算法参数调优实战&#xff1a;解决拓扑优化中的收敛难题 当你第一次在MATLAB中运行SIMP算法时&#xff0c;那种期待与兴奋可能很快就被现实击碎——迭代曲线像过山车一样上下波动&#xff0c;最终结构布满棋盘格&#xff0c;边界模糊不清。这不是算法本身的问题&#xff0c…...

AI 开发实战:需求变更后,如何让 AI 自动补回归范围

AI 开发实战&#xff1a;需求变更后&#xff0c;如何让 AI 自动补回归范围 一、这个问题为什么值得专门拿出来做&#xff1f; 在 AI 工程落地里&#xff0c;真正拖慢团队的往往不是模型本身&#xff0c;而是流程和协作方式没有跟上。 围绕“需求变更后&#xff0c;如何让 AI 自…...

Python串口助手开发避坑实录:新手用tkinter+pyserial常遇到的5个典型问题及解决

Python串口助手开发避坑指南&#xff1a;5个典型问题与实战解决方案 第一次用Python开发串口调试工具时&#xff0c;那种既兴奋又忐忑的心情我至今记得。看着自己写的界面能收发数据&#xff0c;成就感爆棚&#xff1b;但随之而来的各种奇怪问题&#xff0c;又让人抓狂。本文将…...

Ncorr 2D:开源数字图像相关技术的架构解析与工程实现

Ncorr 2D&#xff1a;开源数字图像相关技术的架构解析与工程实现 【免费下载链接】ncorr_2D_matlab 2D Digital Image Correlation Matlab Software 项目地址: https://gitcode.com/gh_mirrors/nc/ncorr_2D_matlab 在材料力学、生物医学和结构工程领域&#xff0c;精确测…...

ROS2接口实战:从传感器数据到自定义消息的完整开发流程(附Python示例)

ROS2接口实战&#xff1a;从传感器数据到自定义消息的完整开发流程&#xff08;附Python示例&#xff09; 在机器人开发领域&#xff0c;数据的高效传递与标准化处理是系统稳定运行的关键。ROS2作为新一代机器人操作系统&#xff0c;其接口系统提供了强大的数据交换能力&#x…...

3步永久保存喜马拉雅VIP音频:xmly-downloader-qt5全功能测评

3步永久保存喜马拉雅VIP音频&#xff1a;xmly-downloader-qt5全功能测评 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 xmly-down…...

基于AI多因子与流动性模型的黄金再定价分析:4500关口修复后的“黄金坑”是否成立?

摘要&#xff1a;本文通过引入AI多因子定价模型&#xff0c;结合流动性压力识别算法、资金流向追踪系统与宏观变量建模&#xff0c;对黄金从5602美元回落至4099美元后的市场行为进行分析&#xff0c;重点解析抛售驱动逻辑、相关性漂移及4500美元关口的再定价机制。一、AI趋势重…...

中国举办,IEEE会议,录用率39.5%!CCF推荐学术会议(C)截稿提醒

►►►Globecom 2026IEEE Global Communications Conference (GLOBECOM), a flagship IEEE Communications Society event, gathers top experts to drive innovation and advance nearly every aspect of communications technology. Each year, thousands of the most ground…...