【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;};
}
相关文章:
![](https://img-blog.csdnimg.cn/img_convert/fedf93a06f52f955e2045444b6cf9504.png)
【C++】---Stack和Queue的用法及其模拟实现
文章目录Stack最小栈栈的弹出压入序列逆波兰表达式求值用栈实现队列模拟实现queue用队列实现栈模拟实现Stack stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。它的使用和之前学习的ve…...
![](https://www.ngui.cc/images/no-images.jpg)
Python GUI编程
Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8…...
![](https://img-blog.csdnimg.cn/09e6c309bce749d2961eea3226013c90.jpeg)
2023年浙江水利水电施工安全员精选真题题库及答案
百分百题库提供水利水电施工安全员考试试题、水利水电施工安全员考试预测题、水利水电施工安全员考试真题、水利水电施工安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 119.下列关于大模板按照的说法正确的是&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
Solon2 开发之插件,三、插件体外扩展机制(E-Spi)
插件体外扩展机制,简称:E-Spi。用于解决 fatjar 模式部署时的扩展需求。比如: 把一些“业务模块”做成插件包放到体外把数据源配置文件放到体外,方便后续修改 其中, .properties 或 .yml 文件都会做为扩展配置加载&a…...
![](https://www.ngui.cc/images/no-images.jpg)
数据结构与算法(Java版) | 数据结构与算法的关系
从这一节起,咱们就要开始进入到「第二章——数据结构与算法的介绍」的学习中了,总的来说,第二章要讲解的内容其实也不是特别的多,内容也多偏理论,相信大家学起来是会比较轻松愉快的。 接下来,就请大家跟随…...
![](https://www.ngui.cc/images/no-images.jpg)
华科万维C++章节练习3_7
题目: 编程实现两种温度体系华氏温度和摄氏温度的相互转换; 以F作为华氏温度体系的单位,以C作为摄氏温度体系的单位。 要求当输入以F作为单位的温度值时(温度值范围[-500F~500F], 否则提示“数据输入有误!”)将其转换为对应的摄氏…...
![](https://img-blog.csdnimg.cn/5bf90c1688a144728f0983c1dc5ecec7.png)
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…...
![](https://www.ngui.cc/images/no-images.jpg)
[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 …...
![](https://www.ngui.cc/images/no-images.jpg)
驱动开发 2.13
设备树 设备树就是一种描述硬件信息的树形结构,设备树上有很多设备节点,每一个设备节点都描述了一个硬件设备信息,设备节点中也可以再包含子设备节点和设备属性,同一个节点的不同属性是以链表结构存储,设备树有.dts设…...
![](https://img-blog.csdnimg.cn/113e06e2dfdb40d3b8bac1f45e8dd6dd.png)
【数据库】sql函数和多表关联查询
目录 一,SQL函数 1,聚合函数 1, count函数 2, AVG函数 3, SUM函数 4, MAX函数 5, MIN函数 6,数据分组——GROUP BY 7,限定组的结果,HAVING 8&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
6-周赛332总结
6-周赛332总结 过了Q1和Q2,Q2知道用二分但是边界处理的不是很好,迷迷糊糊过的(手动再移动了下返回值…) Q3知道将子字符串的值取出来,将最短位置放在哈希表中,然后异或在哈希表中找值。但是我这个猪头脑袋…...
![](https://img-blog.csdnimg.cn/img_convert/009947530b159604f805664dd1ff26f0.png)
嵌入式Qt 开发一个音乐播放器
上篇文章:RK3568源码编译与交叉编译环境搭建,进行了OK3568开发板软件开发环境搭建,通过编译RK3568的源码,可以得到Qt开发的交叉编译相关工具。 本篇,就来在搭建好的软件开发中,进行Qt软件的开发测试。由于…...
![](https://www.ngui.cc/images/no-images.jpg)
2023秋招万得集团AI算法岗面经分享
本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页:秋招算法类面经分享 主要分享计算机算法类在面试互联网公司时候一些真实的经验 2022年 11.22下午AI算法岗面试 (1)一面35min 1、自我介绍 2、科研:长文本MRC...
![](https://img-blog.csdnimg.cn/053d12600c2d4454bf07d836596dc5be.png)
RoI Transformer论文翻译详解
Learning RoI Transformer for Oriented Object Detection in Aerial Images 0.摘要 航空图像中的目标检测是计算机视觉中一个活跃而又具有挑战性的任务,因为它具有鸟瞰视角、高度复杂的背景和变化的物体外观。特别是在航空图像中检测密集的目标时,基于…...
![](https://img-blog.csdnimg.cn/25eb528bbfb449ddb30004cc2bf22573.png)
Prometheus 自动发现监控AWS EC2实例
本文章简述对接自动发现AWS云EC2实例 前提环境: PromethuesGrafanaAWS IAM权限 涉及参考文档: AWS EC2Grafana 通用监控模板 一、IAM 用户创建 1、创建Prometheus 策略 策略规则: {"Version": "2012-10-17",&quo…...
![](https://img-blog.csdnimg.cn/img_convert/e559833aa332df34727a016af6f31709.webp?x-oss-process=image/format,png)
从recat源码角度看setState流程
setState setState() 将对组件 state 的更改排入队列批量推迟更新,并通知 React 需要使用更新后的 state 重新渲染此组件及其子组件。其实setState实际上不是异步,只是代码执行顺序不同,有了异步的感觉。 使用方法 setState(stateChange | u…...
![](https://img-blog.csdnimg.cn/9e788e83354149cdbcee6dd0325e8fae.png)
【Java|golang】1234. 替换子串得到平衡字符串---双指针
有一个只含有 ‘Q’, ‘W’, ‘E’, ‘R’ 四种字符,且长度为 n 的字符串。 假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。 给你一个这样的字符串 s,请通过「替换一个子串」的方式,…...
![](https://img-blog.csdnimg.cn/f45387bd5c2540498ed4c9f14578da82.png)
自监督表征学习方法——BYOL(Bootstrap Your Own Latent)
自监督表征学习方法——BYOL(Bootstrap Your Own Latent) 参考文献:《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》 1.前言背景 学习良好的图像表示是计算机视觉中的一个关键挑战,因为它允许对下游任务进行有效的训练。许…...
![](https://www.ngui.cc/images/no-images.jpg)
均衡负载集群(LBC)-1
均衡负载集群(LBC) 客户–>通过Internet—>负载调度器—>n台真实服务器 负载调度器: 软件:LVS;Nginx;Haproxy硬件:F5; LVS架构: 使用到C/S(B/S…...
![](https://img-blog.csdnimg.cn/78d9136e2a7d4213aafa648ae8f8450b.png)
WebSocket
关于WebSocket: WebSocket 协议在2008年诞生,2011年成为国际标准。现在所有浏览器都已经支持了。 WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话…...
![](https://img-blog.csdnimg.cn/4fd4a77263234421bcc874d6eb9a7f47.png)
GA-PEG-GA,Glutaric Acid-PEG-Glutaric Acid,戊二酸-聚乙二醇-戊二酸供应
英文名称:Glutaric Acid-PEG-Glutaric Acid,GA-PEG-GA 中文名称:戊二酸-聚乙二醇-戊二酸 GA-PEG-GA是一种线性双功能PEG羧酸试剂。PEG和羧基COOH之间存在C4酯键。PEG羧酸可用于与氨基反应,与NHS和DCC、EDC等肽偶联试剂反应。 P…...
![](https://img-blog.csdnimg.cn/097ead65692d4dccbb7e7e31df54f602.png#pic_center)
使用sqlmap + burpsuite sql工具注入拿flag
使用sqlmap burpsuite sql工具注入拿flag 记录一下自己重新开始学习web安全之路③。 目标网站:http://mashang.eicp.vip:1651/7WOY59OBj74nTwKzs3aftsh1MDELK2cG/ 首先判断网站是否存在SQL注入漏洞 1.找交互点 发现只有url这一个交互点,搜索框和登录…...
![](https://img-blog.csdnimg.cn/56afefb1a5ca43f986dc2fb159df268c.png)
替代AG9300|替代NCS8823|CS5260 Type-C转VGA视频转换方案
替代AG9300|替代NCS8823|CS5260 Type-C转VGA视频转换方案 CS5260是一款是一款实现USB TYPE-C到VGA视频转换的单片机解决方案转换器。CS5260支持USB Type-C显示端口交替模式,CS5260可以将视频和音频流从USB Type-C接口传输到VGA端口。在CS5260芯片中,显示…...
![](https://img-blog.csdnimg.cn/img_convert/ab781e763a55b53c836365e0ab390762.jpeg)
乐鑫特权隔离机制的 OTA 固件升级
固件空中升级 (OTA, Over-The-Air) 是任何联网设备的重要功能之一,支持开发人员通过远程更新固件,以发布新功能或修复错误。乐鑫特权隔离框架中包含两类应用程序:受保护的应用程序 (protected_app) 和用户应用程序 (user_app) ,这…...
![](https://img-blog.csdnimg.cn/0c9b88ad4fa14c1fb1d8ddaada441b4e.png)
C++数据结构 —— 二叉搜索树
目录 1.二叉搜索树的基本概念 1.1二叉搜索树的基本特征 2.二叉搜索树的实现 2.1数据的插入(迭代实现) 2.2数据的搜索(迭代实现) 2.3中序遍历(递归实现) 2.4数据的删除(迭代实现) 2.5数据的搜索(递归实现) 2.6数据的插入(递归实现) 2.7数据的删除(递归实现) 2.8类的完…...
![](https://www.ngui.cc/images/no-images.jpg)
Maven面试题及答案
1、Maven有哪些优点和缺点 优点: 1、简化项目依赖管理 2、方便与持续集成工具(Jenkins)整合 3、有助于多模块项目开发,比如一个模块开发好后发布到仓库,依赖该模块时可以直接从远程仓库更新,不用自己手动去编译 4、有很多插件&am…...
![](https://www.ngui.cc/images/no-images.jpg)
WebRTC系列-Qos系列之接收放RTX处理
文章目录 1. RTX详解1.1 RTX包头解析1.2 RTX包中的OSN2. RTX在WebRTC中处理2.1 组包2.2 解包2.3 发送及接收处理流程2.3.1 发送流程2.3.2 rtx标记的设置流程2.3.3 解析流程2.3.4 RTX解包在上一篇 WebRTC系列-Qos系列之接收NACK文章中分析了接收到nack后解析的主要流程。在WebR…...
![](https://www.ngui.cc/images/no-images.jpg)
国内能否炒伦敦金,2023国际十大正规伦敦金交易平台排名
在目前的投资市场环境中,现货黄金是一种屡见不鲜的投资选择,它依靠国际化的投资环境,成为了世界范围内投资者的重要选择对象。进行现货黄金投资,人们除了要认识市场发展基本现状之外,更要做好基本面和技术面分析工作&a…...
![](https://www.ngui.cc/images/no-images.jpg)
react路由 - react-router-dom
react路由 现代的前端应用大多都是 SPA(单页应用程序),也就是只有一个 HTML 页面的应用程序。因为它的用户体验更好、对服务器的压力更小,所以更受欢迎。为了有效的使用单个页面来管理原来多页面的功能,前端路由应运而…...
![](https://img-blog.csdnimg.cn/img_convert/4a23f7fdc6870dbc616e04645b681e18.png)
01-RTOS
对于裸机而言,对于RTOS而言即:对于裸机,打游戏意味着不能回消息 回消息意味着不能打游戏对于RTOS 打游戏和裸机的切换只需要一个时间片节拍 1ms 从宏观来看 就是同时进行的两件事(但要在这两件事情的优先级一样的情况下࿰…...
ip地址进入网站怎么做的/市场调研报告
MACD 的三个最有价值技术为: 多空力量对比、背离买卖、水上金叉。 除此之外,利用形态研判买卖点也非常有效,配合其主要价值技术,对于买点与卖点的把握也极其精确。 MACD形态跟K线形态差不多,大概为: 双顶…...
![](/images/no-images.jpg)
怎么通过网络推广/seo教程视频
MVC中如果用string(string是包含html代码的字符串)形式输出字符串,那么对应的html标签会自动转义,如果想直接输出html可用以下方法: (new HtmlString( "<h1>asdfasd</h1>")) 从网上还搜到&…...
![](/images/no-images.jpg)
网站开发手机充值接口/福州seo扣费
window window是浏览器的一个实例,在浏览器中,window对象又双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象1 选择练习 1 关于BOM下列说法正确的是?(选择两项&am…...
![](/images/no-images.jpg)
建网站做点什么好/万网域名官网
题目 题目链接 题解 考查字符串的输入吧。 每次获取字符串后getchar一下就可以得到空格或回车。 注意输出每行后要多输出一个回车。 代码 #include<bits/stdc.h> using namespace std;string s; int cnt, n;int main() {cin >> n;while(cin>>s) {cout &…...
![](/images/no-images.jpg)
二手房网站平台怎么做/品牌关键词优化哪家便宜
本文参考自《剑指offer》一书,代码采用Java语言。题目输入两个链表,找出它们的第一个公共结点。思路蛮力法:遍历第一个链表的结点,每到一个结点,就在第二个链表上遍历每个结点,判断是否相等。时间复杂度为O…...
![](/images/no-images.jpg)
正规网站开发流程/外贸推广方式都有哪些
# 函数a [1, 3, 6, 4, 85, 32, 46]print(sum(a)) # sum,求和函数def add():a 1,b 2,return a bprint(add())def add(a, b): # 都必填return a bprint(add())def add(a0, b0): # 都非必填return a bprint(add())def add(a, b0): # a必填(必填项放前面)return a…...