深入解析:【C++】stack|queue|deque

news/2025/11/15 14:10:01/文章来源:https://www.cnblogs.com/gccbuaa/p/19225361

容器适配器

什么是适配器?

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。

STL标准库中stack和queue的底层结构

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque(下面我们会详细介绍)。


一、stack

1. stack的介绍和使用

在这里插入图片描述

栈常见的基本接口:

在这里插入图片描述

在这里插入图片描述


2. stack的模拟实现

由于我们上面大概介绍了一下容器适配器,所以这里我们使用适配器作为类的第二个模板参数。并将类的第二个模板参数的缺省值设置为vector<T>类型,因为无论从在后面我们可以通过给定第二个模板参数来使用不同的容器适配stack。有了适配容器后,我们就可以通过调用适配容器的接口实现stack的接口了。

namespace cjl
{
//适配器模式
template<class T,class Container = vector<T>>class stack{private:Container _con;};#pragma once#include<iostream>using namespace std;#include<vector>#include<list>namespace cjl{//适配器模式template<class T,class Container = 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();}//取栈中元素个数size_t size(){return _con.size();}private:Container _con;};}

3. stackOJ习题

最小栈

在这里插入图片描述

解题思路:

开两个栈,一个普通的栈和一个_minst,_minst是一个专门用来记录最小值
的栈,当插入的元素小于等于_minst栈顶元素或者_minst栈中为空时,就将该元素插入_minst栈中,如果要是插入的元素比_minst栈中的元素大时,就将该元素插入另一个栈中。

当pop元素时,如果pop的元素和_minst中的top元素相等时,弹出_minst中的栈顶元素,否则仅仅弹出普通栈中的元素。这样我们每次都弹出_minst的栈顶元素时,都一定会是最小值。

解题代码:

class MinStack {
public:
MinStack()
{}
void push(int val) {
_st.push(val);
if(_minst.empty() || val <= _minst.top())
_minst.push(val);
}
void pop() {
if(_minst.top()==_st.top())
_minst.pop();
_st.pop();
}
int top() {
return _st.top();
}
int getMin() {
return _minst.top();
}
private:
stack<int> _st;stack<int> _minst;};

栈的压入、弹出序列

在这里插入图片描述

解题思路:

这道题的大思路是模拟入栈和出栈的过程,入栈的同时,如果发现栈顶的元素和需要出栈的元素相同且栈不为空,那就以此作为循环条件持续出栈。如果元素全部入栈且经过循环条件全部出栈,那么栈最后一定为空栈,所以最后判断栈是否为空栈即可。

解题代码:

class Solution {
public:
//模拟入栈和出栈的过程
bool IsPopOrder(vector<int> pushV,vector<int> popV) {int pushi = 0,popi = 0;//利用入栈来控制外循环while(pushi<pushV.size()){st.push(pushV[pushi++]);while(!st.empty()&&st.top()==popV[popi]){st.pop();popi++;}}return st.empty();}private:stack<int> st;};

逆波兰表达式求值

在这里插入图片描述

解题思路:

这道题的核心思路是根据逆波兰表达式(后缀表达式)来计算结果,思路如下:我们先开一个栈,遍历vector容器中的每一个字符串,遇到运算数就入栈,遇到运算符依次取栈顶元素作为右操作数和左操作数。然后再进行运算,运算后将元素入栈,继续下一次的遍历,直到将vector容器中的元素全部遍历完成。

解题代码:

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

二、queue

1. queue的介绍和使用

在这里插入图片描述

  1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
  2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。
  3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:
    empty:检测队列是否为空
    size:返回队列中有效元素的个数
    front:返回队头元素的引用
    back:返回队尾元素的引用
    push_back:在队列尾部入队列
    pop_front:在队列头部出队列
  4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

队列常见的基本接口

在这里插入图片描述
在这里插入图片描述


2. queue的模拟实现

namespace cjl
{
template<class T,class Container = list<T>>class queue{public://入队void push(const T& x){_con.push_back(x);}//出队void pop(){_con.pop_front();}//返回队首元素const T& front(){return _con.front();}//返回队尾元素const T& back(){return _con.back();}//返回队列中元素个数size_t size(){return _con.size();}//队列判空操作bool empty(){return _con.empty();}private:Container _con;};}

三、deque

1. deque的原理介绍

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。

在这里插入图片描述

deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:

在这里插入图片描述


2. deque的迭代器设计

双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示:

在这里插入图片描述
在这里插入图片描述


3. deque的优缺点

deque的优点如下:

deque的缺点:

虽然deque有以上的缺点和不足,但是他也有自己的用途:适合做stack和deque的默认适配容器。具体原因如下:

//queue
namespace cjl
{
template<class T,class Container = deque<T>>class queue{public://入队void push(const T& x){}//...private:Container _con;};}//stacknamespace cjl{//适配器模式template<class T,class Container = deque<T>>class stack{public://压栈void push(const T& x){}//...private:Container _con;};}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/966262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPT-Sovits模型实现AI声音克隆

函数计算FC+文件存储NAS ,快速使用GPT-Sovits模型实现AI声音克隆,本方案内置基础模型+默认语音,让用户体验一键部署的简单与方便。函数计算FC 函数计算(Function Compute)是一个事件驱动的全托管 Serverless 计算…

2025年抑尘剂供货厂家权威推荐榜单:煤矿阻化剂/氯化镁/无水氯化镁源头厂家精选

在环保政策与工业安全标准不断提升的背景下,2025年中国抑尘剂市场规模已达亿元级别,其中煤矿用抑尘剂及阻化剂需求占比显著,具备技术研发能力与完备资质的抑尘剂供货厂家正获得更多市场份额。 抑尘剂作为工业粉尘治…

RAG的工作原理

扩展答疑机器人的知识范围了解RAG的工作流程 创建一个RAG应用 RAG的工作原理 你在考试的时候有可能会因为忘记某个概念或公式而失去分数,但考试如果是开卷形式,那么你只需要找到与考题最相关的知识点,并加上你的理…

2025年玻璃防霉纸厂家权威推荐榜单:铝板衬纸/晶圆隔离纸/电池片隔离纸源头厂家精选

在玻璃制造与运输过程中,玻璃防霉纸通过有效隔离和防霉成分,能将玻璃因霉变造成的损失率显著降低,已成为高品质玻璃生产与储存不可或缺的防护材料。 本文将基于企业生产能力、产品质量、技术研发与市场服务等多维度…

2025年陶瓷密封环圆台平面磨床批发厂家权威推荐榜单:陶瓷密封筒磨削圆台平面磨床/纸管圆刀片圆台平面磨床/包装材料圆刀片圆台平面磨床源头厂家精选

在高端制造业精密加工需求持续增长的背景下,陶瓷密封环圆台平面磨床市场正迎来新一轮技术升级。据行业数据显示,2025年中国数控磨床市场规模已达亿元级别,其中陶瓷密封环等精密部件的加工设备需求增速显著。 陶瓷密…

2025年室内橡胶地垫批发厂家权威推荐榜单:幼儿园橡胶地垫/橡胶地垫/橡胶防滑地垫源头厂家精选

在健身房、幼儿园、体育馆等各类场所,室内橡胶地垫凭借其出色的防滑、减震和隔音性能,已成为保障安全和提升体验的关键材料。选择优质的批发厂家,能确保地垫在耐磨性、环保性和使用寿命上满足要求。 本文将基于企业…

2025年二氧化碳气体膨胀爆破实力厂家权威推荐榜单:气体爆破原理/气体膨胀爆破/气体爆破源头厂家精选

在矿山开采与工程建设领域,二氧化碳气体膨胀爆破技术正以其安全、环保、高效的特性,逐步成为传统爆破的重要替代方案。据行业数据显示,2025年气体膨胀爆破技术在国内爆破市场的渗透率预计将达到15%以上,市场规模有…

现今智慧客房系统开发团队排名:2025年酒店智能化解决方案权威指南

文章摘要 随着酒店行业数字化转型加速,智慧客房系统市场呈现爆发式增长,2025年全球智能酒店解决方案市场规模预计突破300亿美元。本文基于技术实力、客户口碑、服务能力等多维度评估,为您呈现当前智慧客房系统开发团…

2025年智慧客房系统供应商权威推荐榜单:行业领军企业深度解析

摘要 随着人工智能和物联网技术的快速发展,智慧客房系统行业正迎来爆发式增长。据迈点研究院数据显示,2025年智慧酒店市场规模预计突破800亿元,年复合增长率达23.5%。本文基于技术实力、客户口碑、服务能力等维度,…

2025年安徽靠谱的自助入住系统服务权威推荐

摘要 随着酒店数字化转型加速,2025年安徽自助入住系统行业迎来爆发式增长。根据中国饭店协会数据显示,目前安徽省酒店智能化渗透率已达67%,其中自助入住系统市场规模较去年增长213%。本文基于技术实力、客户口碑、服…

2025年合肥专业的自助入住系统服务商

摘要 随着智慧旅游和数字化酒店的快速发展,2025年安徽省合肥市自助入住系统行业迎来爆发式增长。据统计,合肥市智能酒店渗透率从2023年的35%提升至目前的62%,自助入住设备市场规模年增长率达28%。本文基于行业数据和…

P11267 【MX-S5-T1】王国边缘,我的痛你如何懂QWQ

难受P11267 【MX-S5-T1】王国边缘 显然 \(m\) 一定情况下,每个点有且仅有一个将会跳到的点,这点可以预处理。 每个点都处理完之后,可以从起点开始一直跳,跳 \(k\) 步看终点,这里就可以倍增处理。 难点就在如何预处…

聚焦澳大利亚留学:2025热门机构核心优势对比,录取率/服务/费用一网打尽

聚焦澳大利亚留学:2025热门机构核心优势对比,录取率/服务/费用一网打尽行业权威榜单发布,优质机构综合测评​ 随着中澳教育合作的深化与留学政策的优化,赴澳留学已成为国内学子的热门选择,2024年中国赴澳留学生人…

2025年克锐思变形缝渗漏维修定制厂家权威推荐榜单:克锐思施工缝渗漏维修/克锐思地下室堵漏/克锐思穿墙管渗漏维修服务商精选

在建筑维护领域,变形缝渗漏是常见的工程难题,直接影响建筑结构安全与使用寿命。克锐思结晶自修复防水系统以其独特的技术优势,成为解决此类问题的有效方案。 本文将基于企业技术实力、工程案例、资质认证与服务能力…

英语_阅读_tourist industry_待读

Remember the sunshine you enjoyed with your friends during spring outings or the excitement you felt when you went to visit your granny during the school holidays, 记得你在春游时和朋友们一起享受的阳光,…

RAG RAG(Retrieval-Augmented Generation,检索增强生成)

下载项目wget https://developer-labfileapp.oss-cn-hangzhou.aliyuncs.com/ACP/aliyun_llm_acp_install.sh#!/bin/bash# 定义变量 ENV_NAME="llm_learn" # 虚拟环境名称 REPO_URL="https://git…

load_balance函数代码详解

前言 我们描述CFS任务负载均衡的系列文章一共三篇,第一篇是框架部分,第二篇描述了task placement和active upmigration两个典型的负载均衡场景,第三篇是负载均衡的情景分析,包括tick balance、nohz idle balance和…

2025年专业机构检测制造厂权威推荐榜单:学校实验仪器检验/实验室通用仪器检测/仪器检定检测服务机构精选

在现代工业体系中,专业检测制造厂已成为保障产品质量、提升市场竞争力的关键环节。这些机构通过精密的测量设备、规范的检测流程和专业的分析技术,为制造业的转型升级提供了不可或缺的技术支撑。 本文将基于机构技术…

AI 应用开发新选择:JBoltAI 框架适配 Java 生态,无缝集成现有项目

AI 应用开发新选择:JBoltAI 框架适配 Java 生态,无缝集成现有项目在人工智能重构软件服务形态的当下,Java 作为全球应用最广泛的企业级开发生态,正面临着一场“既要又要”的转型考验:既要保留多年沉淀的存量系统资…

思考文明社会

1.提高普通人生活下限,各行业工资福利待遇应趋于平均。 2.医疗保障加大力度,不要让普通人因为大病倾家荡产。