satck和queue以及priority_queue

2024-06-16 17:20
文章标签 queue priority satck

本文主要是介绍satck和queue以及priority_queue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、stack的介绍和使用

        stack具有后进先出的特性,,stack是被作为容器适配器实现的,容器适配器是利用现有的容器类型作为基础,来创建新的容器类型,容器适配器通常与普通容器提供相同的接口,但可能添加了一些特定的功能和限制;

标准容器vector list deque都可以作为底层容器来构建stack,默认情况下,使用deque作为底层容器;

satck的模拟实现 

//容器适配器模式
template<class T,class Container=vector<T>>
class stack
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}const T& top(){return _con.back();}
private:Container _con;
};

2、queue的使用和介绍

队列是一种容器适配器,具有先进先出的特点,标准容器deque和list可以作为底层容器构建queue,为什么不用vector呢? 因为vectoe进行头删时比较麻烦,代价比较大,

queue的模拟实现   

template<class T,class Container=deque<T>>
class queue
{
public:void push(const T& x){_qt.push_back(x);}void pop(){_qt.pop_front();}size_t size(){return _qt.size();}bool empty(){return _qt.empty();}const T& front(){return _qt.front();}const T& back(){return _qt.back();}private:Container _qt;
};

 3、priority_queue的介绍和使用

优先队列是一种容器适配器,按照降序排序,不管你是怎么插入的,他的第一个元素总是他所包含的元素中最大的那一个,优先队列底层类似于堆,默认按照大堆实现,排降序;

标准容器vector 和deque可以作为底层实现容器,默认情况下使用vector作为底层实现容器

需要支持随机访问迭代器,以便在内部保持堆结构,容器适配器通过调用算法函数make_heap       push_heap    pop_heap  来保持堆结构,

优先队列底层是堆的结构,所以不能用list实现

priority_queue的使用

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

默认情况下priority_queue是大堆;

priority_queue的模拟实现

仿函数,向上调整和向下调整

仿函数其实就是一个类,类里面对operator()的重载,

	template<class T>class less{public:bool operator()(const T& x,const T& y){return x < y;}};template<class T>class greater{public:bool operator()(const T& x, const T& y){return x > y;}};template<class T,class Container=vector<T>,class Compare= greater<T>>class priority_queue{public:void adjust_up(size_t child){size_t parent = (child - 1) / 2;Compare com;while (child > 0){//if (_con[child] > _con[parent])if (com(_con[child] , _con[parent])){swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void adjust_down(size_t parent){size_t child = parent * 2 + 1;Compare com;while (child< _con.size()){//if (child + 1 < _con.size() && _con[child + 1] > _con[child])if (child + 1 < _con.size() && com(_con[child + 1],_con[child])){child++;}//if (_con[child] > _con[parent])if (com(_con[child],_con[parent])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}bool empty(){return _con.empty();}size_t size(){return _con.size();}const T& top(){return _con[0];}private:Container _con;};
}

4、容器适配器

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

STL标准库中sack和queue的底层结构

他们的底层都是用deque和vector实现的;

5、deque的介绍

deque(双端队列):

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

 

deque并不是真正的连续空间,而是由一段段连续的小空间拼接起来的,实际的deque类似于一个动态的二维数组

deque的迭代器设计比较复杂:

deque的优点:

头插、尾插效率高

缺点:

中间插入删除会很麻烦

[]的效率不够极致,比如说用sort排序deque效率很慢,

deque不适合遍历,因为在遍历时,deque的迭代器需要频繁的检测是否移动到某段小空间的边界,导致效率低下

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

stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和queue默认选择deque作为其底层容器,主要是因为:

1. stack和queue不需要遍历(因此stack和queue没有迭代器),只需要在固定的一端或者两端进行操作。

2. 在stack中元素增长时,deque比vector的效率高(扩容时不需要搬移大量数据);queue中的元素增长时,deque不仅效率高,而且内存使用率高。结合了deque的优点,而完美的避开了其缺陷。

这篇关于satck和queue以及priority_queue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067067

相关文章

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

ActiveMQ—Queue与Topic区别

Queue与Topic区别 转自:http://blog.csdn.net/qq_21033663/article/details/52458305 队列(Queue)和主题(Topic)是JMS支持的两种消息传递模型:         1、点对点(point-to-point,简称PTP)Queue消息传递模型:         通过该消息传递模型,一个应用程序(即消息生产者)可以

Java-数据结构-栈和队列-Stack和Queue (o゚▽゚)o

文本目录: ❄️一、栈(Stack):     ▶ 1、栈的概念:   ▶ 2、栈的使用和自实现:      ☑ 1)、Stack():       ☑ 2)、push(E e):      ☑ 3)、empty():         ☑ 4)、peek(E e):        ☑ 5)、pop(E e):       ☑ 6)、size(E e):  ▶ 3、栈自实现的总代

stack,queue, priority_queue

STL 中栈的使用方法(stack) #include <stack> 基本操作: push(x) 将x加入栈中,即入栈操作 pop() 出栈操作(删除栈顶),只是出栈,没有返回值 top() 返回第一个元素(栈顶元素) size() 返回栈中的元素个数 empty() 当栈为空时,返回 true STL 中队列的使用(queue) #i

HDU 1297 Children’s Queue

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1297 题解: D[n]表示有n个人时,满足排队要求的个数。 分类讨论: 1.第n个人为男生时,满足排队要求的个数等于D[n-1]. 2.第n个人为女生时,第n-1个必为女生,才满足要求。 此处还要进行一次分类: a.前n-2个满足排队要求时,个数为D[n-2]. b.前n-2个不满足

C++ STL-Queue容器概念及应用方法详解

1. 再谈队列 队列和栈不同,队列是一种先进先出的数据结构,STL的队列内容极其重要,虽然内容较少但是请务必掌握,STL的队列是快速构建搜索算法以及相关的数论图论的状态存储的基础。 概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口。 队列容器允许从一端新增元素,从另一端移除元素。队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历

ORA-24067: exceeded maximum number of subscribers for queue ADMIN.SMS_MT_QUEUE

临时处理办法: delete from aq$_ss_MT_tab_D;delete from aq$_ss_MT_tab_g;delete from aq$_ss_MT_tab_h;delete from aq$_ss_MT_tab_i;delete from aq$_ss_MT_tab_p;delete from aq$_ss_MT_tab_s;delete from aq$

HDU 3436 Queue-jumpers

题意: n个人站成一排  一开始是从1到n有序的  现在有三个操作  Top操作是将一个人排到队首  Query操作是询问某个人现在排第几  Rank操作是询问排某个位置的人是谁 思路: 将队伍扭来扭去…  很像splay的旋转吧(哪像了!!) 这是个不错的splay题… 首先  n很大  但是操作不多  想到离散化 离散化还有个技巧  我们发现只有top和query操作对单人进

消息队列 think-queue tp5.0

一 介绍 think-queue是tp框架消息队列插件,依赖框架框架核心版本,所以下载时需要选择对应框架核心的版本。 比如tp5.1用2.0的都可以,5.0的用1.1.6。其余版本参考composer。 composer地址:topthink/think-queue - Packagist 不同版本中项目结构不同,一般会说明插件的使用方法,比如配置文件位置。可以在项目中查找“queue.p

Blocking Queue

生产者和消费者的典型考题,用blocking queue来做。 https://zhuanlan.zhihu.com/p/84647595 讲解 启发于:java 8 源代码:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html class BoundedBlockingQueu