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;}}

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...