首页 > 其他分享 >stack和queue

stack和queue

时间:2024-03-18 22:06:05浏览次数:25  
标签:容器 const 队列 元素 back queue stack

stack的介绍

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

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

3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作:

empty:判空操作

back:获取尾部元素操作

push_back:尾部插入元素操作

pop_back:尾部删除元素操作

4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque。

stack的使用           

函数说明                接口说明

stack()                   构造空的栈

empty()                  检测stack是否为空

size()                     返回stack中元素的个数

top()                       返回栈顶元素的引用

push()                    将元素val压入stack

pop()                      stack中尾部的元素弹出

模拟实现一个stack

#include<vector>

template<class T>
class stack
{
public:
	stack() {}
	void push(const T& x) {
		_c.push_back(x);
	}

	void pop() { 
		_c.pop_back(); 
	}

	T& top() { 
		return _c.back(); 
	}

	const T& top()const { 
		return _c.back(); 
	}

	size_t size()const { 
		return _c.size(); 
	}

	bool empty()const { 
		return _c.empty(); 
	}

private:
	std::vector<T> _c;
};

queue的介绍和使用

queue的介绍

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

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

3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操 作:

empty:检测队列是否为空

size:返回队列中有效元素的个数

front:返回队头元素的引用

back:返回队尾元素的引用

push_back:在队列尾部入队列

pop_front:在队列头部出队列

4. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。

queue的使用

函数声明               接口说明

queue()                构造空的队列

empty()                检测队列是否为空,是返回true,否则返回false

size()                    返回队列中有效元素的个数

front()                   返回队头元素的引用

back()                   返回队尾元素的引用

push()                  在队尾将元素val入队列

pop()                    将队头元素出队列

queue的模拟实现

#include <list>
template<class T>
class queue
{
public:
	queue() {}
	void push(const T& x) {
		_qu.push_back(x); 
	}

	void pop() { 
		_qu.pop_front(); 
	}

	T& back() { 
		return _qu.back(); 
	}

	const T& back()const { 
		return _qu.back();
	}

	T& front() { 
		return _qu.front(); 
	}

	const T& front()const { return 
		_qu.front(); 
	}

	size_t size()const { 
		return _qu.size(); 
	}

	bool empty()const { 
		return _qu.empty(); 
	}

private:
	std::list<T> _qu;
};

priority_queue的介绍和使用

1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。

2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。

3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。

4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:

empty():检测容器是否为空

size():返回容器中有效元素个数

front():返回容器中第一个元素的引用

push_back():在容器尾部插入元素

pop_back():删除容器尾部元素

5. 标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指 定容器类,则使用vector。

6. 需要支持随机访问迭代器,以便始终在内部保持堆结构。容器适配器通过在需要时自动调用算法函数 make_heap、push_heap和pop_heap来自动完成此操作。

priority_queue的使用

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成 堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意: 默认情况下priority_queue是大堆。

函数声明                接口说明

priority_queue()      构造一个空的优先级队列        

empty()                  检测优先级队列是否为空,是返回true,否则返回false

size()                     返回优先级队列中最大(最小元素),即堆顶元素

push(x)                  在优先级队列中插入元素x

pop()                     删除优先级队列最大的元素或最小的元素,即堆顶的元素

#include <vector>
#include <queue>
#include <functional> // greater算法的头文件
void TestPriorityQueue()
{
 // 默认情况下,创建的是大堆,其底层按照小于号比较
 vector<int> v{3,2,7,6,0,4,1,9,8,5};
 priority_queue<int> q1;
 for (auto& e : v)
 q1.push(e);
 cout << q1.top() << endl; 
}

模拟实现一个priority_queue

    #include <iostream>
    using namespace std;

    #include <vector>
	template<class T>
	struct less
	{
		bool operator()(const T& left, const T& right)
		{
			return left < right;
		}
	};

	template<class T>
	struct greater
	{
		bool operator()(const T& left, const T& right)
		{
			return left > right;
		}
	};

	template<class T, class Container = std::vector<T>, class Compare = less<T>>
	class priority_queue
	{
	public:
		// 创造空的优先级队列
		priority_queue() : c() {}

		template<class Iterator>
		priority_queue(Iterator first, Iterator last)
			: c(first, last)
		{
			// 将c中的元素调整成堆的结构
			int count = c.size();
			int root = ((count - 2) >> 1);
			for (; root >= 0; root--)
				AdjustDown(root);
		}

		void push(const T& data)
		{
			c.push_back(data);
			AdjustUP(c.size() - 1);
		}

		void pop()
		{
			if (empty())
				return;

			swap(c.front(), c.back());
			c.pop_back();
			AdjustDown(0);
		}

		size_t size()const
		{
			return c.size();
		}

		bool empty()const
		{
			return c.empty();
		}

		// 堆顶元素不允许修改,因为:堆顶元素修改可以会破坏堆的特性
		const T& top()const
		{
			return c.front();
		}
	private:
		// 向上调整
		void AdjustUP(int child)
		{
			int parent = ((child - 1) >> 1);
			while (child)
			{
				if (Compare()(c[parent], c[child]))
				{
					swap(c[child], c[parent]);
					child = parent;
					parent = ((child - 1) >> 1);
				}
				else
				{
					return;
				}
			}
		}

		// 向下调整
		void AdjustDown(int parent)
		{
			size_t child = parent * 2 + 1;
			while (child < c.size())
			{
				// 找以parent为根的较大的孩子
				if (child + 1 < c.size() && Compare()(c[child], c[child + 1]))
					child += 1;

				// 检测双亲是否满足情况
				if (Compare()(c[parent], c[child]))
				{
					swap(c[child], c[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
					return;
			}
		}
	private:
		Container c;
	};

标签:容器,const,队列,元素,back,queue,stack
From: https://blog.csdn.net/xybbbb/article/details/136795029

相关文章

  • 【App Service】在Azure App Service中分析.NET应用程序的性能的好帮手(Review Stack
    AzureAppService.NETProfiler在AppService服务中,如果部署了.NET应用,平台有一个非常好的工具可以查看请求的性能分布及异常时的StackTraces。进入路径:AppServiceAzureOverview-->  Networking(网络)-->Troubleshoot(排除故障)--> Collect.NETProfilerTrace......
  • WPF —— TabControl、StackPanel 控件详解
    1TabControl简介表示包含多个项的控件,这些项共享屏幕上的同一空间。TabControl有助于最大程度地减少屏幕空间使用量,同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个TabItem对象。一次只能看到TabControl中的一个 TabItem。当用户选择的Tab......
  • 【STL】 C++常用容器介绍系列(一)----(map、set、stack)
    目录一、map系列1、map介绍2、unordered_map介绍3、map和unordered_map的选择二、set系列1、set介绍2、unordered_set介绍3、set和unordered_set的选择三、如何遍历和查询map和set1、map的遍历2、map的查询3、set的遍历4、set的查询四、stack介绍和操作stack的方......
  • jstack命令详解及常用命令
    六种Java线程状态新建状态(New):当创建一个Thread实例后,线程就处于新建状态。此时线程对象已经被分配了内存,并初始化了其成员变量的值。就绪状态(Runnable):也被称为“可执行状态”。当调用了线程的start()方法后,线程就进入了就绪状态。此时线程已经具备了执行的条件,等待CPU调度执行......
  • Linux Graphics Stack(图图图)
    Linux图形相关涉及到硬件、内核驱动、协议API、2D/3D渲染框架、GUI框架、桌面环境等,相当复杂,这里简单收集架构图作为记录。1硬件相关显示相关的有:Displaying:显示器、投影等。包括Displayengine、Timingscontroller、DisplayinterfacePHY。Rendering:3Drendering,2Dsha......
  • 【Java】List, Set, Queue, Map 区别?
    目录List,Set,Queue,Map区别?Collection和CollectionsListArrayList和Array区别?ArrayList与LinkedList区别?ArrayList能添加null吗?ArrayList插入和删除时间复杂度?LinkedList插入和删除时间复杂度?LinkedList为什么不能实现RandomAccess接口?SetComparabl......
  • others_babystack
    others_babystackCanary保护程序控制流64位libc泄露bamuwe@bamuwe:~/done/others_babystack$checksecbabystack[*]'/home/bamuwe/done/others_babystack/babystack'Arch:amd64-64-littleRELRO:FullRELROStack:CanaryfoundNX:......
  • queue 和 stack 容器
    queue容器1.queue基本概念**概念:先进先出队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为2.queue常用接口构造函数:queue<T>que;//queue采用模板类实现,queue对象的默认构造形式queue(constqueue&que);//拷贝构造函数赋值操作:queue&operator=......
  • Elastic Stack基础
    ElasticStack组件介绍ElasticsearchElasticsearch是使用java开发,基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等LogstashLogstash基于java开发,是一个数......
  • CYQ.Data 操作 Redis 性能测试:对比 StackExchange.Redis
    前言:前几天,点开自己的博客,看了一下CYQ.DataV5系列 都有哪些文章,发现了一篇2019年写的:CYQ.Data对于分布式缓存Redis、MemCache高可用的改进及性能测试,于是点进去看了看。感觉文章中有些表述存有问题,不过不是重点。重点,看了里面的测试结论,如果四五年过去了,CYQ.Data 低调的......