C++初阶--stack和queue
创始人
2024-05-13 22:29:41
0

目录

stack介绍

stack的使用

stack的模拟实现

queue的介绍

queue的使用

queue的模拟实现

deque

priority_queue

priority_queue的使用

仿函数

priority_queue的模拟实现


stack介绍:

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

 stack的使用:

stack()构造空的栈
empty()检测stack是否为空
size()返回stack中元素个数
top()返回栈顶元素的引用
push()将元素val压入栈中
pop()将stack中尾部的元素弹出

stack的模拟实现:

//适配器模式
namespace qwe
{//stack> s;//stack> s;template>class stack{public:bool empty() const{return _con.empty();}size_t size() const{return _con.size();}const T& top() const{return _con.back();}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}private://vector _v;Container _con;};void test_stack(){//后进先出--不支持迭代器stack s;s.push(1);s.push(2);s.push(3);s.push(400);while (!s.empty()){cout << s.top() << " ";s.pop();}cout << endl;}
}

queue的介绍:

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

 queue的使用:

queue()构造空的队列
empty()检测队列是否为空
size()返回队列中元素个数
front()返回队头元素的引用
back()返回队尾元素的引用
push()在队尾将元素val入队列
pop()将队头的元素出队列

queue的模拟实现:

namespace qwe
{template>class queue{public:bool empty() const{return _con.empty();}size_t size() const{return _con.size();}const T& front() const{return _con.front();}const T& back() const{return _con.back();}void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}private:Container _con;};void test_queue(){//queue> q; //queue> q;queue q;q.push(10);q.push(20);q.push(30);q.push(40);while (!q.empty()){cout << q.front() << " ";q.pop();}cout << endl;}
}

deque:

双端队列,融合vector和list优点。

vector优点:下标随机访问,尾插尾删效率高,cup高速缓存命中高。

vector缺点:扩容(效率、空间浪费)、不适合头插头删。

list优点:按需申请释放空间,任意位置O(1)插入删除。

list缺点:不支持随机访问。

deque:适合头尾的插入删除

如果stack用vector默认适配:

deque优势:扩容代价不大,不需要拷贝数据,浪费空间不多。

如果stack用list默认适配:

deque优势:cpu高速cache命中。不会频繁申请小块空间。申请和释放空间次数少代价低。

如果queue用list默认适配:

deque优势:cpu高速cache命中。不会频繁申请小块空间。申请和释放空间次数少代价低。

priority_queue:

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

 priority_queue的使用:

priority_queue() / priority_queue(first,last)构造
empty()检测是否为空
top() 返回优先级队列中最大(最小元素),即堆顶元素
push(x) 在优先级队列中插入元素x
pop() 删除优先级队列中最大(最小)元素,即堆顶元素

默认情况下priority_queue是大堆

如果在priority_queue中放自定义类型的数据,用户需要在自定义类型中提供> 或者< 的重载。

仿函数:

struct Less
{bool operator()(int x, int y){return x < y;}
};struct Greater
{bool operator()(int x, int y){return x > y;}
};int main()
{// Less->仿函数类型 less就叫函数对象Less less;cout << less(1, 2) << endl;Greater gt;cout << gt.operator()(1, 2) << endl;cout << gt(1, 2) << endl;Less lessi;cout << lessi(1, 2) << endl;cout << Less()(1, 2) << endl;cout << Less()(1.1, 2.2) << endl;return 0;
}

priority_queue的模拟实现:

namespace qwe
{templatestruct Less{bool operator()(const T& x, const T& y) const{return x < y;}};//特化template<>struct Less{bool operator()(Date* x, Date* y)const{return *x < *y;}};templatestruct Greater{bool operator()(const T& x, const T& y) const{return x > y;}};//大的优先级高--大堆template, class Compare = Less>class priority_queue{private:void adjust_up(size_t child){Compare com;size_t parent = (child - 1) / 2;while (child > 0){//if (_con[child] > _con[parent])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void adjust_down(size_t parent){Compare com;size_t child = (parent * 2) + 1;while (child < _con.size()){//if (child + 1 < _con.size() && _con[child + 1] > _con[child])if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){++child;}//if (_con[child] > _con[parent])if (com(_con[parent], _con[child])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}public:priority_queue(){}templatepriority_queue(InputIterator first, InputIterator last):_con(first, last){//建堆for (int i = (_con.size() - 1 - 1) / 2; i >= 0; --i){adjust_down(i);}}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);}const T& top(){return _con[0];}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:Container _con;};void test_priority_queue(){// 默认是大的优先级高 -- 默认给的仿函数是less//priority_queue pq;// 控制小的优先级高 -- 给一个greater的仿函数//priority_queue, Greater> pq;priority_queue, greater> pq;pq.push(3);pq.push(3);pq.push(7);pq.push(1);pq.push(9);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;}}

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...