C++ stack和queue的使用方法与模拟实现

news2024/10/6 8:27:30

文章目录

  • 一、 stack的使用方法
  • 二、 queue的使用方法
  • 三、 容器适配器
  • 四、 stack的模拟实现
  • 五、 queue的模拟实现


一、 stack的使用方法

stack介绍文档

  1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
  • empty:判空操作
  • back:获取尾部元素操作
  • push_back:尾部插入元素操作
  • pop_back:尾部删除元素操作
  1. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。

在这里插入图片描述

函数说明接口说明
stack()构造空的栈
empty()检测stack是否为空
size()返回stack中元素的个数
top()返回栈顶元素的引用
push()将元素val压入stack中
pop()将元素val压入stack中
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	st.push(4);
	cout << "容量是:" << st.size() << endl;
	while (!st.empty())
	{
		cout << st.top() << " ";
		st.pop();
	}
	cout << endl;
	cout << "容量是:" << st.size() << endl;
	return 0;
}

在这里插入图片描述

二、 queue的使用方法

queue的介绍文档

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

在这里插入图片描述

函数声明接口说明
queue()构造空的队列
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头元素出队列
#include<iostream>
#include<stack>
#include<queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	q.push(4);
	cout << "容量是:" << q.size() << endl;
	while (!q.empty())
	{
		cout << q.front() << " ";
		q.pop();
	}
	cout << endl;
	cout << "容量是:" << q.size() << endl;
	return 0;
}

在这里插入图片描述

三、 容器适配器

C++ STL (Standard Template Library) 中的容器适配器是一种特殊的容器,它们通过封装和扩展其他容器(如 std::vectorstd::liststd::deque)的功能来提供额外的功能或接口。容器适配器本身并不存储数据,而是将它们的工作委托给基础容器。

C++ STL 提供了三种主要的容器适配器:

  1. std::stack

    • 提供了后进先出(LIFO)的数据结构。
    • 主要操作包括 push(添加元素到栈顶)、pop(从栈顶删除元素)、top(访问栈顶元素但不删除)和 empty(检查栈是否为空)等。
    • 默认情况下,std::stack 使用 std::deque 作为其底层容器,但你可以通过模板参数指定其他容器。
  2. std::queue

    • 提供了先进先出(FIFO)的数据结构。
    • 主要操作包括 push(在队尾添加元素)、pop(从队头删除元素)、front(访问队头元素但不删除)、back(访问队尾元素但不删除)和 empty(检查队列是否为空)等。
    • 默认情况下,std::queue 使用 std::deque 作为其底层容器,但同样可以指定其他容器。
  3. std::priority_queue

    • 提供了带有优先级队列的数据结构,其中元素总是按优先级排序(默认情况下是最大堆)。
    • 主要操作包括 push(添加元素并重新排序)、pop(删除最高优先级的元素并重新排序)、top(访问最高优先级的元素但不删除)和 empty(检查队列是否为空)等。
    • std::priority_queue 还允许你指定比较函数或函数对象,以定义元素的优先级顺序。

使用容器适配器的好处是它们提供了简洁、易于使用的接口,同时允许你使用任何符合要求的底层容器。这使得你可以轻松地更改底层容器的实现,而无需修改使用容器适配器的代码。

四、 stack的模拟实现

在这里插入图片描述
在stack类模板声明当中的模板参数有两个,第一个是stack当中所存储的元素类型,第二个就是指定使用的容器类型。如果不指定使用什么容器的话,stack默认使用deque

函数说明接口说明实现方法
swap()交换两个栈中的数据调用指定容器的swap()函数
empty()检测stack是否为空调用指定容器的empty()函数
size()返回stack中元素的个数调用指定容器的size()函数
top()返回栈顶元素的引用调用指定容器的back()函数
push()将元素val压入stack中调用指定容器的oush_back()函数
pop()将元素val压入stack中调用指定容器的pop_back()函数

代码实现如下:

#pragma once
#include<vector>
#include<list>
#include<deque>

namespace hao
{
	//template<class T,class Container=std::vector<T> >
	template<class T, class Container = std::deque<T> >
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		size_t size()
		{
			return _con.size();
		}
		T& top()
		{
			return _con.back();
		}
		bool empty()
		{
			return _con.empty();
		}
		void swap(const stack<T,Container>& st )
		{
			_con.swap(st._con);
		}
	private:
		Container _con;
	};
	void test_stack()
	{
		//stack<int, vector<int>> st1;
		stack<int> st1;
		st1.push(1);
		st1.push(2);
		st1.push(3);
		st1.push(4);

		while (!st1.empty())
		{
			std::cout << st1.top() << " ";
			st1.pop();
		}
		std::cout << std::endl;

		stack<int, std::list<int>> st2;
		st2.push(1);
		st2.push(2);
		st2.push(3);
		st2.push(4);

		while (!st2.empty())
		{
			std::cout << st2.top() << " ";
			st2.pop();
		}
		std::cout << std::endl;
	}
}

五、 queue的模拟实现

在queue类模板声明当中的模板参数有两个,第一个是queue当中所存储的元素类型,第二个就是指定使用的容器类型。如果不指定使用什么容器的话,queue默认使用deque
在这里插入图片描述

函数说明接口说明实现方法
swap交换两个队列中的数据调用指定容器的swap()函数
empty()检测队列是否为空,是返回true,否则返回false调用指定容器的empty()函数
size()返回队列中有效元素的个数调用指定容器的size()函数
front()返回队头元素的引用调用指定容器的front()函数
back()返回队尾元素的引用调用指定容器的back()函数
push()在队尾将元素val入队列调用指定容器的push_back()函数
pop()将队头元素出队列调用指定容器的pop_front()函数

代码实现如下:

#pragma once
#include<list>
#include<deque>

namespace hao
{
	//template<class T,class Container=std::list<T> >
	template<class T, class Container = std::deque<T> >
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_front();
		}
		size_t size()
		{
			return _con.size();
		}
		T& front()
		{
			return _con.front();
		}
		T& back()
		{
			return _con.back();
		}
		bool empty()
		{
			return _con.empty();
		}
		void swap(queue<T, Container>& q)
		{
			_con.swap(q._con);
		}
	private:
		Container _con;
	};
	void test_queue()
	{
		queue<int, std::list<int>> q;

		//queue<int, vector<int>> q;
		q.push(1);
		q.push(2);
		q.push(3);
		q.push(4);

		while (!q.empty())
		{
			std::cout << q.front() << " ";
			q.pop();
		}
		std::cout << std::endl;
	}
}

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

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

相关文章

8 聚类算法

目录 0 背景 1 Kmeans 1.1 聚类数量k的确定 2 DBSCAN 2.1 三个点 2.2 算法流程 3 层次聚类 3.1 过程 4 基于分布的聚类:高斯混合模型 0 背景 聚类算法是一种无监督学习技术&#xff0c;用于将数据集中的数据点划分为不同的组或簇&#xff0c;使得同一组内的数据点彼此相…

线性卷积和圆周卷积

文章目录 【 1. 线性卷积 】1.1 图解分析1.2 矩阵相乘实现线性卷积1.3 圆周卷积实现线性卷积1.4 实例:线性卷积的两种实现方法【 2. 圆周卷积 】2.1 图解分析2.2 矩阵相乘实现圆周卷积2.3 频域点乘实现圆周卷积2.4 实例:圆周卷积两种实现方法【 3. 线性卷积和圆周卷积的等价 …

算法导论 总结索引 | 第三部分 第十二章:二叉搜索树

1、搜索树数据结构 支持 许多动态集合操作&#xff0c;包括 SEARCH、MINIMUM、MAXIMUM、PREDECESSOR、SUCCESSOR、INSERT 和 DELETE 等。使用搜索树 既可以作为一个字典 又可以作为一个优先队列 2、二叉搜索树上的基本操作 所花费的时间 与这棵树的高度成正比。对于有n个结点的…

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

Messari 报告摘要 :Covalent Network(CQT)2024 年第一季度表现

摘要&#xff1a; 尽管 CQT 代币流通供应量增加了 20%&#xff08;新增 1.04 亿枚 CQT&#xff09;&#xff0c;但 CQT 的质押百分比仅从 2023 年第一季度的 22% 增长到了 2024 年第一季度的 29%。 CQT 的市值季度环比增长了 28%&#xff0c;多次达到 2.75 亿美元&#xff0c…

QT5之事件——包含提升控件

事件概述 信号就是事件的一种&#xff0c;事件由用户触发&#xff1b; 鼠标点击窗口&#xff0c;也可以检测到事件&#xff1b;产生事件后&#xff0c;传给事件处理&#xff0c;判断事件类型&#xff0c;后执行事件相应函数&#xff1b; 类似单片机的中断&#xff08;中断向量…

STL 标准模板库

以下是一些常用的STL容器&#xff1a; vector&#xff1a;动态数组&#xff0c;提供快速的随机访问。list&#xff1a;双向链表&#xff0c;支持快速插入和删除操作。set&#xff1a;有序集合&#xff0c;存储唯一的元素。map&#xff1a;有序映射&#xff0c;存储键值对。sta…

数据库(MySQL)—— DQL语句(基本查询和条件查询)

数据库&#xff08;MySQL&#xff09;—— DQL语句&#xff08;基本查询和条件查询&#xff09; 什么是DQL语句基本查询查询多个字段字段设置别名去除重复记录 条件查询语法条件 我们今天进入MySQL的DQL语句的学习&#xff1a; 什么是DQL语句 MySQL中的DQL&#xff08;Data Q…

【Docker第一课】docker的基本命令和试启动容器(详细图解)

目录 知识梗概 docker的初步了解 了解docker常用命令 试开启容器&#xff08;这里演示nginx、python3和mysql&#xff09; 1、nginx容器的启动 2、python3容器的启动 docker的作用 虚拟机与容器的区别 写在前面&#xff1a; 本专栏你将了解docker一些入门知识&#xff…

【解决方案】Can‘t exec “locale”: No such file or directory

【解决方案】Cant exec “locale”: No such file or directory 还可能出现的错误&#xff1a; 1. 报错原因&#xff1a; 缺少ldconfig 2. 解决方案&#xff1a; sudo apt-get download libc-bin dpkg -x libc-bin*.deb unpackdir/ sudo cp unpackdir/sbin/ldconfig /sbin/ s…

机器学习:深入解析SVM的核心概念【三、核函数】

核函数 **问题一&#xff1a;为什么说是有限维就一定存在高维空间可分呢&#xff1f;**原始空间与特征空间为什么映射到高维空间可以实现可分核函数的作用 **问题二&#xff1a;最终怎么得到函数**从对偶问题到决策函数的步骤&#xff1a;结论 **问题三&#xff1a;为什么说特征…

Coursera: An Introduction to American Law 学习笔记 Week 04: Constitutional Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 04: Constitutional LawKey Constitutional Law TermsSup…

Golang chan 实现原理

Golang&#xff1a;context基于go1.22版本 chan的作用和使用方法共享内存的优缺点 chan 的使用方法 chanel 的底层结构channel 结构体创建channel写流程异常处理写时有阻塞读流程写时无阻塞读流程&#xff0c;缓冲区有空间写时无阻塞读流程&#xff0c;缓冲区无空间写流程整体架…

PC通过串口发送指令控制LED+串口中断

如何让单片机接收数据&#xff1f; 首先要打开SCON中的串行接收控制位REN。当REN1时为允许接收状态&#xff0c;可以接收信息。 因此令SCON 0x50&#xff1b; 怎么知道收到数据&#xff1f; 利用RI接收中断请求标志位。当串行接收到第8位结束时由内部硬件自动置为RI1&#…

Matlab各个版本介绍、区别分析及推荐

MATLAB&#xff0c;由美国MathWorks公司出品&#xff0c;是一款广泛应用的商业数学软件。自其诞生之初&#xff0c;MATLAB便以其强大的矩阵计算能力、灵活的编程环境以及广泛的应用领域&#xff0c;赢得了全球科研工作者和工程师的青睐。本文将详细介绍MATLAB的各个版本&#x…

基于springboot+vue+Mysql的学生毕业离校系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

牛客美团2024年春招第一场笔试【技术】解题

1.小美的平衡矩阵 小美拿到了一个n∗n的矩阵&#xff0c;其中每个元素是 0 或者 1。 小美认为一个矩形区域是完美的&#xff0c;当且仅当该区域内 0 的数量恰好等于 1 的数量。 现在&#xff0c;小美希望你回答有多少个i∗i的完美矩形区域。你需要回答1≤i≤n的所有答案 输出…

ArcGIS+ChatGPT双剑合璧:从数据读取到空间分析,一站式掌握GIS与AI融合的前沿科技!

目录 专题一 AI大模型应用 专题二 ArcGIS工作流程及功能 专题三 prompt的使用技巧 专题四 AI助力工作流程 专题五 AI助力数据读取 专题六 AI助力数据编辑与处理 专题七 AI助力空间分析 专题八 AI助力遥感分析 专题九 AI助力二次开发 专题十 AI助力科研绘图 专题十一…

chrome extension插件替换网络请求中的useragent

感觉Chrome商店中的插件不能很好的实现自己想要的效果,那么就来自己动手吧。 本文以百度为例: 一般来说网页请求如下: 当前使用的useragent是User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safar…

【模板】差分

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分模板。 b[0]a[0]; b[1]a[1]-a[0]; b[2]a[2]-a[1]; ...... b[n-1]a[n-1]-a[n-2]; b[n]a[n]-a[n-1]; 差分标记&#xff1a;b[l]k,b…