C++ stack与queue模拟实现详解

 更新时间:2021年08月30日 10:53:45   作者:可乐不解渴  
这篇文章主要给大家介绍了关于c++stack与queue模拟实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编来一起学习学习吧

stack与queue模拟实现

在stl中,stack(栈)与queue(队列)都是容器适配器。

什么是容器适配器呢?

适配器(adaptor)是标准库中通用的概念,包括容器适配器、迭代器适配器和函数适配器。本质上,适配器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已存在的容器类型采用另一种不同的抽象类型的工作方式实现。简单来说其实就是利用现有的容器来适配出来的新容器。

stack

在标准库中,stack默认使用的是deque容器来进行适配的。
当然这里也可以适配vector容器和list容器。

namespace ZJ
{
	//template<class T,class Container= ZJ::list<T>>
	//template<class T,class Container= ZJ::vector<T>>
	template<class T,class Container= ZJ::deque<T>>
	class stack
	{
	public:
		void pop()
		{
			m_stack.pop_back();
		}
		void push(const T&val)
		{
			m_stack.push_back(val);
		}
		size_t size()	const
		{
			return static_cast<size_t>(m_stack.size());
		}
		T& top()	
		{
			return m_stack.back();
		}
		const T& top() const
		{
			return m_stack.back();
		}
		bool empty()	const
		{
			return m_stack.empty();
		}
	private:
		Container m_stack;
	};
}

queue

与stack一样,在标准库中默认使用的是deque容器来进行适配的。

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

为什么选择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有一个致命缺陷:不适合遍历,特别是在遍历或者排序时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下。

总结

本片文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C/C++中的atan和atan2函数实例用法

    C/C++中的atan和atan2函数实例用法

    在本篇文章里小编给大家分享的是一篇关于C/C++中的atan和atan2函数实例用法相关内容,有兴趣的朋友们可以学习下。
    2020-02-02
  • 使用C语言实现扫雷游戏

    使用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了使用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++遍历文件夹下的所有文件

    C++遍历文件夹下的所有文件

    数据分多个文件存储,读取数据就需要对多个文件进行操作。下面通过实例代码给大家讲解C++遍历文件夹下的所有文件,感兴趣的的朋友一起看看吧
    2017-08-08
  • C语言实现链队列代码

    C语言实现链队列代码

    这篇文章主要为大家详细介绍了C语言实现链队列代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Qt中Tab与Tree组件实现分页菜单

    Qt中Tab与Tree组件实现分页菜单

    本文主要介绍tabWidget选择夹组件与TreeWidget树形选择组件的常用方法及灵活运用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)

    c++双向链表操作示例(创建双向链、双向链表中查找数据、插入数据等)

    这篇文章主要介绍了c++双向链表操作示例,包括创建双向链、删除双向链表、双向链表中查找数据、插入数据等,需要的朋友可以参考下
    2014-05-05
  • C语言函数之memcpy函数用法实例

    C语言函数之memcpy函数用法实例

    memcpy函数用于把资源内存(src所指向的内存区域)拷贝到目标内存(dest所指向的内存区域),下面这篇文章主要给大家介绍了关于C语言函数之memcpy函数用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • C语言中关于指针变量的坑

    C语言中关于指针变量的坑

    这篇文章主要给大家介绍了关于C语言中关于指针变量坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • C语言中炫酷的文件操作实例详解

    C语言中炫酷的文件操作实例详解

    内存中的数据都是暂时的,当程序结束时,它们都将丢失,为了永久性的保存大量的数据,C语言提供了对文件的操作,这篇文章主要给大家介绍了关于C语言中文件操作的相关资料,需要的朋友可以参考下
    2021-10-10
  • C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及区别

    这篇文章主要介绍了C语言 指针与数组的详解及对比的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论