【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)

这篇具有很好参考价值的文章主要介绍了【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL),C++,c++,开发语言

前言

文章绑定了VS平台下std::stack和std::queue的源码,大家可以下载了解一下😍
前面我们讲了C语言的基础知识,也了解了一些数据结构,并且讲了有关C++的命名空间的一些知识点以及关于C++的缺省参数、函数重载,引用 和 内联函数也认识了什么是类和对象以及怎么去new一个 ‘对象’ ,以及学习了几个STL的结构也相信大家都掌握的不错,接下来博主将会带领大家继续学习有关C++比较重要的知识点—— stack & queue(STL)。下面话不多说坐稳扶好咱们要开车了😍

stack

1. stack概念

stack 的文档介绍

在C++中std::stack是一个模板类,它是基于容器的适配器,用于实现堆栈数据结构。堆栈是一种后进先出(LIFO)的数据结构,类似于现实生活中的一叠盘子。std::stack类位于<stack>头文件中,并且是C++标准库的一部分。它提供了一组成员函数和操作符,用于对堆栈进行操作。
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL),C++,c++,开发语言

2. stack特点

  1. 后进先出(LIFO):std::stack是一种后进先出的数据结构,这意味着最后压入堆栈的元素将首先被弹出

  2. 基于容器的适配器:std::stack是基于容器的适配器,它使用底层容器来存储元素。默认情况下,std::deque被用作底层容器,但你也可以选择其他容器,如std::vectorstd::list

  3. 快速插入和删除:由于std::stack是基于容器的适配器,它使用底层容器的插入和删除操作来实现元素的压入和弹出。这些操作的时间复杂度通常是常数时间,因此插入和删除操作非常高效

  4. 无索引访问:std::stack不支持通过索引访问元素。你只能访问堆栈顶部的元素,即使用top()函数。如果你需要访问其他位置的元素,你需要先将顶部的元素弹出。

  5. 无迭代器支持:std::stack不支持迭代器,因此你不能使用迭代器遍历堆栈中的元素。如果你需要遍历堆栈中的元素,你需要先将它们弹出。

  6. 大小可变:std::stack的大小是可变的,你可以根据需要动态地压入和弹出元素。

3. stack使用

  1. 包含头文件:首先,你需要包含<stack>头文件,以便使用std::stack类。
#include <stack>
  1. 创建堆栈对象:使用std::stack类创建一个堆栈对象。你需要指定堆栈中元素的类型。例如,如果你想创建一个存储整数的堆栈,你可以这样做:
std::stack<int> myStack;
  1. 压入元素:使用push(element)函数将元素压入堆栈的顶部。你可以连续调用push()函数来压入多个元素。
myStack.push(10);
myStack.push(20);
myStack.push(30);
  1. 弹出元素:使用pop()函数从堆栈的顶部移除元素。你可以使用循环或条件语句来连续弹出元素。
myStack.pop();
  1. 访问顶部元素:使用top()函数可以访问堆栈顶部的元素,但不会将其从堆栈中移除。
int topElement = myStack.top();
  1. 检查堆栈是否为空:使用empty()函数可以检查堆栈是否为空。如果堆栈为空,返回true;否则返回false
if (myStack.empty()) {
    // 堆栈为空
} else {
    // 堆栈不为空
}
  1. 获取堆栈的大小:使用size()函数可以获取堆栈中元素的数量。
int stackSize = myStack.size();

这些是使用std::stack的一般步骤。可以根据需要进行堆栈的操作,如压入元素、弹出元素、访问顶部元素等。

queue

1. queue概念

queue的文档介绍

在C++中,queue(队列)是一种数据结构,它遵循先进先出(FIFO)的原则。它类似于现实生活中的排队,新元素被添加到队列的末尾,而从队列中移除元素时,总是从队列的前端开始
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL),C++,c++,开发语言

2. queue特点

  1. 先进先出(FIFO):std::queue是一种先进先出的数据结构,这意味着最先添加到队列的元素将首先被移除。

  2. 基于容器的适配器:std::queue是基于容器的适配器,它使用底层容器来存储元素。

  3. 快速插入和删除:由于std::queue是基于容器的适配器,它使用底层容器的插入和删除操作来实现元素的添加和移除。这些操作的时间复杂度通常是常数时间,因此插入和删除操作非常高效。

  4. 无索引访问:std::queue不支持通过索引访问元素。你只能访问队列的前端和末尾元素,即使用front()back()函数。

  5. 无迭代器支持:std::queue不支持迭代器。如果你需要遍历队列中的元素,你需要先将它们移除。

  6. 大小可变:std::queue的大小是可变的,你可以根据需要动态地添加和移除元素。

3. queue使用

  1. 包含头文件:首先,你需要包含<queue>头文件,以便使用std::queue类。
#include <queue>
  1. 创建队列对象:使用std::queue类创建一个队列对象。你需要指定队列中元素的类型。例如,如果你想创建一个存储整数的队列,你可以这样做:
std::queue<int> myQueue;
  1. 添加元素:使用push(element)函数将元素添加到队列的末尾。你可以连续调用push()函数来添加多个元素。
myQueue.push(10);
myQueue.push(20);
myQueue.push(30);
  1. 移除元素:使用pop()函数从队列的前端移除元素。你可以使用循环或条件语句来连续移除元素。
myQueue.pop();
  1. 访问前端和末尾元素:使用front()函数可以访问队列的前端元素,使用back()函数可以访问队列的末尾元素,但不会将它们从队列中移除。
int frontElement = myQueue.front();
int backElement = myQueue.back();
  1. 检查队列是否为空:使用empty()函数可以检查队列是否为空。如果队列为空,返回true;否则返回false
if (myQueue.empty()) {
    // 队列为空
} else {
    // 队列不为空
}
  1. 获取队列的大小:使用size()函数可以获取队列中元素的数量。
int queueSize = myQueue.size();

这些是使用std::queue的一般步骤。可以根据需要进行队列的操作,如添加元素、移除元素、访问前端和末尾元素等。

容器适配器

1. 什么是适配器

适配器是一种设计模式,它允许将一个类的接口转换为另一个类的接口,以便两个类可以协同工作。适配器模式通常用于解决两个不兼容的接口之间的问题。

在C++中,适配器也可以指代标准库中的容器适配器。容器适配器是一种特殊类型的容器,它使用底层容器来提供不同的接口和功能。适配器通过封装底层容器的操作,提供了一组新的操作和语义

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

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL标准库中std::stackstd::queue。它们分别基于底层容器(默认为std::deque)提供了堆栈和队列的功能。
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL),C++,c++,开发语言
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL),C++,c++,开发语言

3. STL标准库中对于stack和queue的模拟实现

⭕stack的模拟实现

template<class T, class Container = deque<T>>
class stack
{
public:
	//入栈
	void push(const T& x)
	{
		_con.push_back(x);
	}
	//出栈
	void pop()
	{
		_con.pop_back();
	}
	//返回栈顶数据
	T& top()
	{
		return _con.back();
	}
	//返回const类型栈顶数据
	const T& top() const
	{
		return _con.back();
	}
	//判断是否为空
	bool empty()
	{
		return _con.empty();
	}
	//返回栈的大小
	size_t size() const
	{
		return _con.size();
	}
private:
	Container _con;
};

⭕stack的模拟实现

template<class T, class Container = deque<T>>
class queue
{
public:
	//进入队列
	void push(const T& x)
	{
		_con.push_back(x);
	}		//出队列
	void pop()
	{
		_con.pop_front();
	}
	//返回队尾数据
	T& back()
	{
		return _con.back();
	}
	//返回队头数据
	T& front()
	{
		return _con.front;
	}
	//返回const类型队尾数据
	const T& back() const
	{
		return _con.back();
	}
	//返回const类型队头数据
	const T& front() const
	{
		return _con.front;
	}
	//判断是否为空
	bool empty() const
	{
		return _con.empty();
	}
	//返回队列大小
	size_t size() const
	{
		return _con.size();
	}
private:
	Container _con;
};

总结

stack是一种后进先出(LIFO)的数据结构,它是一种容器适配器。它的特点是最后添加的元素将首先被移除。stack使用底层容器来存储元素,默认情况下使用std::deque作为底层容器。。queue是一种先进先出(FIFO)的数据结构,也是一种容器适配器。它使用底层容器来存储元素,默认情况下使用std::deque作为底层容器。适配器是一种设计模式,它允许将一个类的接口转换为另一个类的接口,以便两个类可以协同工作。在STL标准库中,stack和queue是基于其他容器实现的容器适配器。它们使用底层容器来存储元素,并提供了堆栈和队列的功能。

温馨提示

感谢您对博主文章的关注与支持!在阅读本篇文章的同时,我们想提醒您留下您宝贵的意见和反馈。如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL),C++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-664363.html

到了这里,关于【C++入门到精通】C++入门 —— 容器适配器、stack和queue(STL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

    C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

    介绍完了list类的相关内容后:C++初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器

    2024年02月19日
    浏览(13)
  • 容器适配器---deque和STL ---stack queue priority_queue的模拟实现 C++

    目录 一、容器适配器 deque原理 deque的缺陷 deque的优势 二、stack的模拟实现  三、queue的模拟实现 四、优先级队列的模拟实现 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户

    2024年02月02日
    浏览(10)
  • 【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

    【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

    适配器是一种设计模式 (设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 例如我们常见的充电器就是一种适配器,它将我们常用的220V交流电压转化为4,5V (或者其他更高的电

    2023年04月26日
    浏览(11)
  • 【C++从入门到放弃】stack和queue的深度剖析及空间适配器的介绍

    【C++从入门到放弃】stack和queue的深度剖析及空间适配器的介绍

    🧑‍💻作者: @情话0.0 📝专栏:《C++从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   此篇博客将谈及到的stack、queue和priority_queue都不是STL的标准容器,而是一种空间适配器。它是通过对一种容器进行

    2024年02月11日
    浏览(11)
  • STL: 容器适配器stack 与 queue

    STL: 容器适配器stack 与 queue

      目录 1.容器适配器 1.1 STL标准库中stack和queue的底层结构 1.2 deque的简单介绍(了解) 1.2.1 deque的原理介绍 1.2.2 deque的缺陷 1.2.3 为什么选择deque作为stack和queue的底层默认容器 2. stack的介绍和使用 2.1 stack的介绍  2.2 stack的使用 2.3 利用deque模拟实现stack 3.queue的介绍和使用 3.1 queue的

    2024年02月05日
    浏览(13)
  • 【STL】容器适配器stack和queue常见用法及模拟实现

    【STL】容器适配器stack和queue常见用法及模拟实现

    1.stack介绍及使用 1.1 stack的介绍 stack文档介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器是使用特定容器类的封装对象作为其基础容器的类,提供一

    2024年02月06日
    浏览(12)
  • 【C++干货铺】适配器 | stack | queue

    【C++干货铺】适配器 | stack | queue

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列学习专栏: C++干货铺 代码仓库: Gitee ========================================================================= 目录 stack的介绍和使用 stack的介绍 stack的使用 queue的介绍和使用 queue的介绍 qu

    2024年02月05日
    浏览(22)
  • 【C++】容器适配器之priority_queue & 仿函数

    【C++】容器适配器之priority_queue & 仿函数

    我们和学习之前的容器一样,可以使用cplusplus官网进行学习:priority_queue文档介绍 priority_queue(优先级队列)是一种容器适配器,它 和queue使用同一个头文件,其底层结构是一个堆,并且默认情况下是一个大根堆,此外,priority_queue也不支持迭代器,这是为了不破坏堆的结构使用

    2024年02月01日
    浏览(7)
  • 适配器模式实现stack和queue

    适配器模式实现stack和queue

    适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器

    2024年02月11日
    浏览(12)
  • STL stack,queue,deque以及适配器

    STL stack,queue,deque以及适配器

    下面是stack库中的接口函数,有了前面的基础,我们可以根据函数名得知函数的作用 函数 说明 stack() 构造空栈 empty() 判断栈是否为空 size() 返回栈中元素个数 top 返回栈顶元素 push() 将值从栈顶压入栈内 pop() 在栈顶出栈 栈其实就是一种特殊的 vector ,因此可以使用 vector 模拟实

    2024年02月10日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包