C++中stack类和queue类

06-01 1317阅读

C++中stack类和queue类

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步

数据结构习题_LaNzikinh篮子的博客-CSDN博客

初阶数据结构_LaNzikinh篮子的博客-CSDN博客

收入专栏:C++_LaNzikinh篮子的博客-CSDN博客

其他专栏:c语言基础_LaNzikinh篮子的博客-CSDN博客

个人主页:LaNzikinh-CSDN博客

文章目录

  • 前言
  • 一.容器适配器
  • 二.栈的实现stack
  • 三.队列的实现queue
  • 四.优先级队列priority_queue()
  • 五.deque(双向队列)
  • 总结

    前言

    前面我们讲解了C++中List,Vector,和string类的使用和底层逻辑,今天我们来利用前3个类,来搭建栈和队列,在讲解前,我们先来引入一个容器适配器的概念


    一.容器适配器

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

    C++中stack类和queue类

    C++中stack类和queue类

    虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和队列只是对其他容器的接口进行了包装,STL标准库中stack和queue的底层结构中stack和queue默认使用deque。

    二.栈的实现stack

    接口函数

    1.push()将元素val压入stack中

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

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

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

    5.empty()检测stack是否为空

    实现

    我们之前说过,栈他是一种适配器,stack只是对其他容器的接口进行了包装,所以我们从栈的接口中可以看出,栈实际是一种特殊的vector,因此使用vector完全可以模拟实现stack。

    #include
    namespace yyz
    {
    template
    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 _c;
    };
    }

    三.队列的实现queue

    接口函数

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

    empty:检测队列是否为空

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

    front:返回队头元素的引用

    back:返回队尾元素的引用

    push_back:在队列尾部入队列

    pop_front:在队列头部出队列

    实现

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

    #include 
    namespace yyz
    {
    template
    class queue
    {
    public:
    //用编译器默认的构造函数
    queue() {}
    void push(const T& x) {_c.push_back(x);}
    void pop() {_c.pop_front();}
    T& back() {return _c.back();}
    const T& back()const {return _c.back();}
    T& front() {return _c.front();}
    const T& front()const {return _c.front();}
    size_t size()const {return _c.size();}
    bool empty()const {return _c.empty();}
    private:
    std::list _c;
    };
    }
    

    四.优先级队列priority_queue()

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

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

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

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

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

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

    这里我们的实现是用堆去实现的,堆的本质是数组,所以优先级队列作为适配器,只需要通过对vector进行通用的封装即可   

    C++中stack类和queue类​            

    #include
    template
    class Less
    {
    public:
    	bool operator()(const T& x, const T& y)
    	{
    		return x  y;
    	}
    };
    namespace yyz
    {
    	// 默认是大堆
    	template
    	class priority_queue
    	{
    	public:
    		void AdjustUp(int child)
    		{
    			Compare com;
    			int parent = (child - 1) / 2;
    			while (child > 0)
    			{
    				//if (_con[parent] = n说明孩子不存在,调整到叶子了
    			{
    				// 找出小的那个孩子
    				//if (child + 1  
     
    

    五.deque(双向队列)

    我们前面说了,栈和队列在STL标准库中stack和queue的底层结构中stack和queue默认使用deque。所以我们这次来看看deque到底是什么

    C++中stack类和queue类C++中stack类和queue类

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

    C++中stack类和queue类

    在标准库里实现的stack和queue

    namespace yyz
    {
    	template
    	class queue
    	{
    	public:
    		void push(const T& x)
    		{
    			_con.push_back(x);
    		}
    		void pop()
    		{
    			_con.pop_front();
    		}
    		const T& front() const
    		{
    			return _con.front();
    		}
    		const T& back() const
    		{
    			return _con.back();
    		}
    		size_t size() const
    		{
    			return _con.size();
    		}
    		bool empty() const
    		{
    			return _con.empty();
    		}
    	private:
    		Container _con;
    	};
    }
    namespace yyz
    {
    	// Containerתstack
    	template
    	class stack
    	{
    	public:
    		void push(const T& x)
    		{
    			_con.push_back(x);
    		}
    		void pop()
    		{
    			_con.pop_back();
    		}
    		const T& top() const
    		{
    			//return _con.func();
    			return _con.back();
    		}
    		size_t size() const
    		{
    			return _con.size();
    		}
    		bool empty() const
    		{
    			return _con.empty();
    		}
    	private:
    		Container _con;
    	};
    }


    总结

    这次讲解了C++中栈和队列的使用,下次对模板在做一点补充      

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码