【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 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
[特殊字符] 手撸 Redis 互斥锁那些坑
📖 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作,想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁,也顺便跟 Redisson 的 RLock 机制对比了下,记录一波,别踩我踩过…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
