【C++ 】stack 和 queue

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

【C++ 】stack 和 queue,c++

1. 标准库中的stack

stack 的介绍:

1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作

2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类

a. stack 的使用

【C++ 】stack 和 queue,c++

注意:

如果要访问所有元素得到栈顶元素,再pop,直到为空

2. stack的模拟实现

代码

namespace lhy
{ 
	template<class T,class container = vector<T>>
	class stack
	{
	public:
		void push(const T& x)
		{
			_t.push_back(x);
		}
		void pop()
		{
			_t.pop_back();
		}
		size_t size()
		{
			return _t.size();
		}
		bool empty()
		{
			return _t.empty();
		}
		const T& top()
		{
			return _t.back();
		}
	private:container _t;
	};

【C++ 】stack 和 queue,c++

//用法很像缺省参数,不过这里缺省的是类型

3. 标准库中的queue

queue 的介绍:

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素

2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列

3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类

a. queue 的使用

【C++ 】stack 和 queue,c++

4. queue的模拟实现

代码

namespace lhy
{ 
	template<class T,class container = list<T>>
	class queue
	{
	public:
		void push(const T& x)
		{
			_v.push_back(x);
		}
		void pop()
		{
			_v.pop_front();
		}
		bool empty()
		{
			return _v.size() == 0;
		}
		const T& back()
		{
			return _v.back();
		}
		const T& front()
		{
			return _v.front();
		}
		size_t size()
		{
			return _v.size();
		}

	private:
		container _v;
	};

5. priority_queue (优先级队列)

优先级队列的介绍:

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构

因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue

注意:

默认情况下priority_queue是大堆

a. priority_queue 的使用

  • priority_queue() (无参构造函数)
  • priority_queue(InputIterator first, InputIterator last)
  • empty() (判空)
  • push() (尾插)
  • pop () (删除栈顶元素,即第一个元素)
  • top() (返回栈顶元素)

6. priority_queue 的模拟实现

代码

namespace lhy
{

	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 container = vector<T>, class compare = less<T>>
	class priority_queue
	{
	private:
		container con;
		void AdjustUp(int child)
		{
			int parent = (child - 1) / 2;
			while (child > 0)
			{
				if (compare()(con[parent], con[child]))
				{
					std::swap(con[parent], con[child]);
				}
				else
				{
					break;
				}
				child = parent;
				parent = (child - 1) / 2;
			}
		}
		void AdjustDown(int parent)
		{
			int child = parent * 2 + 1;
			while (child < size())
			{
				if (child + 1 < size() && con[child] > con[child + 1])
				{
					child++;
				}
				if (compare()(con[parent], con[child]))
				{
					std::swap(con[parent], con[child]);
				}
				else
				{
					break;
				}
				parent = child;
				child = parent * 2 + 1;
			}
        }
	public:
			size_t size()
			{
				return con.size();
			}
			void push(const T & x)
			{
				con.push_back(x);
				AdjustUp(size() - 1);
			}
			void pop()
			{
				swap(con[0], con[size() - 1]);
				con.pop_back();
				AdjustDown(0);
			}
			bool empty()
			{
				return con.empty();
			}
			const T& top()
			{
				return con[0];
			}

		};
}

代码注意事项

【C++ 】stack 和 queue,c++

这两个类实际上又可以说成伪函数,这里通过比较大小判断建大堆还是小堆

用法如下:

【C++ 】stack 和 queue,c++

compare()是匿名对象,后面接着是调用 less 类 或者 greater 类的运算符重载()文章来源地址https://www.toymoban.com/news/detail-852349.html

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

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

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

相关文章

  • 【C++】开始使用stack 与 queue

    送给大家一句话: 忍受现实给予我们的苦难和幸福,无聊和平庸。 – 余华 《活着》 在之前的学习中,我们已经对 STL 模板中的 string list vector 等容器进行了详细的探讨,从而获得了对这些容器操作的清晰理解。基于这些知识,现在转向学习 stack(栈) 和 queue(队列)就显得

    2024年04月23日
    浏览(21)
  • C++ STL--->stack和queue

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

    2024年01月16日
    浏览(35)
  • 【C++】stack、queue模拟实现+仿函数

    铁汁们,今天给大家分享一篇stack、queue模拟实现+仿函数,来吧,开造⛳️ stack是容器适配器,专门用于进行”先进后出”操作的环境中,只能在容器的一端进行数据的插入和删除操作,元素在特定容器的尾部(即栈顶)被压入和弹出。 容器适配器是将特定的类进行封装,将其

    2024年03月19日
    浏览(32)
  • C++的stack和queue+优先队列

    适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 stack和queue都是容器适配器,底层都是通过去适配双端队列deque去实现的,STL中没有把stack和queue划分在容

    2024年02月13日
    浏览(21)
  • C++:Stack和Queue的模拟实现

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

    2024年03月12日
    浏览(29)
  • 【C++】stack与queue的模拟实现

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 stack与queue的实现比较简单,本篇不会有太大的篇幅,但值得我们学习的是『 适配器

    2024年01月24日
    浏览(34)
  • [C++随笔录] stack && queue模拟实现

    🗨️stack的容器适配器应该选什么比较好呢? 首先, stack的特点是 头部入, 尾部出 ⇒ 尾插 和 尾删操作比较频繁 我们前面学过的容器有 vector 和 list, vector 和 list的尾插 和 尾删的时间复杂度是 O(1) , 还是适合做容器适配器的. stack的基本结构 用这个容器对象来进行模拟实现stac

    2024年02月06日
    浏览(31)
  • 【C++杂货铺】详解 stack 和 queue

            欢迎收看本期【C++杂货铺】,本期内容将讲解C++STL中stack和queue的内容,其中包含了stack , queue,priority_queue是什么,怎么使用以及模拟实现这些容器。         此外,还将将讲解设计模式中的适配器模式,以及STL中stack,queue的底层deque。         stack是一种容器适配

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

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

    2024年02月05日
    浏览(36)
  • C++ deque/queue/stack的底层原理

    和 vector 容器采用连续的线性空间不同,deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域。 deque采用一块所谓的map数组(注意,不是STL的map容器)作为主控。 这里所谓map是一小块连续空间 (类似于ve

    2024年02月16日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包