STL——stack和queue

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

一、stack和queue

stl中提供了栈和队列配接器供我们使用,以后就可以直接使用了。不需要我们自己造轮子。

使用细节参考文档就可以,与之学过的容器并无二致。栈和队列的特性我们再学习数据结构时已经了解了。这里就不在赘述了。

stack - C++ Reference (cplusplus.com)

queue - C++ Reference (cplusplus.com)

这里有几个题可供我们练习一下:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

栈的压入、弹出序列_牛客题霸_牛客网

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

在模拟实现stack和queue,我们先了解一下容器适配器;什么是适配器呢?

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

stl标准库中stack和queue的底层结构就是使用了适配器模式;虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque(双端队列)下面介绍

STL——stack和queue,c++,c++

STL——stack和queue,c++,c++

stack的模拟实现

    template<class T, class Con = deque<int>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			_con.pop_back();
		}
		int size()
		{
			return _con.size();
		}
		T& top()
		{
			return _con.back();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Con _con;
	};

queue模拟实现

    //双端队列适合进行两端插入删除操作,不适合在中间插入。
	//相较于vector来说,扩容更好一点。
	//相较于list来说,支持随机访问
	template<class T, class Con = deque<T>>//默认类型是双端队列
	class queue
	{
	public:
		void push(const T& x)
		{
			_con.push_back(x);
		}
		void pop()
		{
			//_con.erase(_con.begin());  //vector没有pop_front
			_con.pop_front();          
		}
		int size()
		{
			return _con.size();
		}
		T& front()
		{
			return _con.front();
		}
		T& back()
		{
			return _con.back();
		}
		bool empty()
		{
			return _con.empty();
		}
	private:
		Con _con;
	};

二、deque——双端队列

deque概念

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

STL——stack和queue,c++,c++

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

STL——stack和queue,c++,c++

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

STL——stack和queue,c++,c++

deque的缺陷:

  • 与vector相比,deque的优势是:头部插入和删除时,不需要搬移元素,效率高;而且在扩容时,也不需要搬移大量的元素,因此效率是比vector高。
  • 与list相比,deque底层是连续空间,空间利用率高,不需要存储额外字段。
  • deque的缺陷:不适合遍历,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下;而序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构
    时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构。

为什么选择deque作为stack和queue的底层默认容器

  • stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或两端操作。
  • 在stack中元素增长时,deque比vector效率高(扩容时不需要搬移大量数据),queue中的元素增长时,deque不仅效率高,而且内存使用率高。

三、priority_queue——优先级队列

priority_queue概念

priority_queue - C++ Reference (cplusplus.com)

STL——stack和queue,c++,c++

priority_queue也是一个容器适配器,用vector实现的。

priority_queue底层采用的数据结构是堆(默认是大堆)。

STL——stack和queue,c++,c++

 因为这里使用了仿函数,调用的是less这个类,所以是大堆。

练习: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

什么是仿函数

仿函数就是使用起来类似于使用一个函数,但是它实际上不是调用函数,而是通过类的对象调用类中重载的括号运算符成员函数,从而达到我们的目的。

仿函数可以作为模板参数使用,因为每个仿函数都拥有自己的类型。

仿函数比一般函数更灵活。文章来源地址https://www.toymoban.com/news/detail-661840.html

priority_queue模拟实现

    template<class T>
    struct Less
    {
	    bool operator()(const T& x, const T& y)
	    {
		    return x < y;
	    }
    };


    template<class T>
    struct Greater
    {
    	bool operator()(const T& x, const T& y)
    	{
	    	return x > y;
	    }
    };    


    template<class T, class Con = vector<T>, class Compare = Less<T>>
	class priority_queue
	{
	private:
		//向下调整建堆,建大堆
		void Adjust_down(int parent)
		{
			Compare com;
			int child = parent * 2 + 1;
			while (child < _con.size())
			{
				if (child + 1 < _con.size() && com(_con[child], _con[child + 1]))
				{
					++child;
				}
				if (com(_con[parent], _con[child]))
				{
					swap(_con[parent], _con[child]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
				{
					break;
				}
			}
		}

		void Adjust_up(int child)
		{
			Compare com;
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				if (com(_con[parent], _con[child]))
				{
					swap(_con[parent], _con[child]);
					child = parent;
					parent = (child - 1) / 2;
				}
				else
				{
					break;
				}
			}
		}

	public:
		template<class InputIterator>
		priority_queue(InputIterator first, InputIterator last)
		{
			while (first != last)
			{
				_con.push_back(*first);
				++first;
			}
			for (int i = (_con.size() - 1 - 1) / 2; i >= 0; i--)
			{
				Adjust_down(i);
			}
		}
		priority_queue()
		{}

		void push(const T& x)
		{
			_con.push_back(x);
			Adjust_up(_con.size() - 1);

		}
		void pop()
		{
			swap(_con[0], _con[_con.size() - 1]);
			_con.pop_back();
			Adjust_down(0);
		}
		size_t size() const 
		{
			return _con.size();
		}
		bool empty() const
		{
			return _con.empty();
		}
		const T& top()
		{
			return _con[0];
		}
	private:
		Con _con;
	};

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

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

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

相关文章

  • C++ STL--->stack和queue

    stack文档 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。 stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为

    2024年01月16日
    浏览(46)
  • STL——stack容器和queue容器详解

      目录 💡stack 💡基本概念 常用接口  💡queue 💡基本概念 💡常用接口 栈(stack): 一种特殊的线性表,其只允许在固定的一端进行插入和删除操作。在进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈中的元素都遵循后进先出的原则(LIFO,Last In First Out)。 压栈

    2024年02月02日
    浏览(37)
  • 【c++】STL之stack和queue详解

    作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 目标:掌握stack和queue库,了解deque库 毒鸡汤:小时候,哭是我们解决问题的绝招,长大后,笑是我们面对现实的武器。 望小伙伴们点赞👍收藏✨加关注哟💕💕  今天

    2024年02月19日
    浏览(41)
  • 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日
    浏览(47)
  • STL之stack+queue的使用及其实现

    所属专栏:C“嘎嘎\\\" 系统学习❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ stack的文档介绍 stack是一种容器适配器,专门用在具有后进先

    2024年02月21日
    浏览(29)
  • STL——stack容器、queue容器、list容器

    就是栈 栈不允许有遍历行为 是先进后出的数据结构 是先进先出的数据结构 **队列容器允许从一端新增元素,从另一端移除元素 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为 队列中进数据称为—入队push 队列中出数据称为—出队pop ** 在STL中这个链表

    2024年02月09日
    浏览(38)
  • 【C++】学习STL中的stack和queue

            今天这篇博客的内容主要关于STL中的stack、queue和priority_queue三种容器。         stack和queue的使用方式非常简单,我们只要根据之前学习数据结构的经验和文档介绍就可以轻松上手。于是我们直接开始对它们的模拟实现。         stack和queue我们在数据结构阶段就曾经

    2024年02月10日
    浏览(42)
  • 【STL】stack、queue基本使用和模拟实现

    目录 前言 stack 接口介绍 模拟实现 queue 接口介绍 模拟实现 没有迭代器  deque介绍 stack 和 queue 本质上是一种容器配接器,就像我们平时充电时使用的电源适配器,能够将电压转换成设备能够接受的程度。 其通过封装特定容器作为其底层容器的类,通过一组特定的成员函数来

    2024年02月07日
    浏览(39)
  • 【STL】stack与queue的底层原理及其实现

    (图片来自知乎) 1.stack是一种 容器适配器 ,模拟了栈的数据结构。数据只能从一端进去,另一端出来( 先进后出 )。 2.stack适配器 默认是由 deque 容器实现 的,也可以显示要求stack的底层封装的容器类型。由于栈的特性, array 和 forward_list 不能用来构造stack适配器 。 3.st

    2024年04月10日
    浏览(45)
  • STL stack,queue,deque以及适配器

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

    2024年02月10日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包