C++ 之 【队列的简介 与 模拟实现】

目录

1.队列的简介

1.1队列的使用

2.队列的模拟实现

2.1前提准备

 2.2模拟实现

2.2.1默认成员函数

2.2.2常用函数的实现 

3.完整源码+测试


1.队列的简介

队列是一种数据结构,也是一种特殊的线性表

队列只允许一端进行插入数据操作,在另一端进行删除数据操作

1.1队列的使用

queue<double> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);

cout << q.size() << endl;

while (!q.empty())
{
	cout << q.front() << ' ';
	q.pop();
}
cout << endl;

2.队列的模拟实现

2.1前提准备

(1)

创建一个Queue.h文件来声明模拟实现的队列

同时,因为C++库里面已经有了队列的实现,所以我们为了避免命名冲突

创建一个新的命名空间来封装模拟实现的队列

 (2)

队列是一种线性表,所以队列既可以用数组(vector)实现也可以用链表实现

当然链表实现优于数组数组实现

学了模板之后,我们就将选择权交给用户,即让用户选择用数组还是链表实现栈

namespace dfq1
{
	template<class T, class Container>
	class queue
	{

	private:
		Container _con;
	};
}

 (3)

就像上面代码所示

队列本身不直接管理数据存储,而是通过封装底层容器(如 vector(不推荐)deque 或 list进而提供统一的先进先出的接口,所以队列实际上是一种 容器适配器  

deque我们后续进行简要介绍

适配器就像一个‘翻译官’或‘转换器’,它把不兼容的东西‘包装’起来,对外只提供一个简单统一的接口,让不同的设备或系统能顺利‘对话’和合作

简单来说就是将一种接口转化为另一种接口

底层容器提供的操作与队列所需的“先进先出”(FIFO)语义不直接对应 

通过封装底层容器(如 vector(不推荐)、deque 、list进而提供统一的先进先出的接口

就展现了队列适配器的本质

 2.2模拟实现

2.2.1默认成员函数

队列通过封装底层容器(如 std::liststd::deque)来管理数据存储,因此栈对象的构造、拷贝、移动和析构等操作通常无需手动实现。编译器会自动调用底层容器的对应构造函数、拷贝/移动构造函数以及析构函数,生成默认的成员函数。但需注意以下特殊情况

  1. 若底层容器是自定义类型(如用户定义的容器类),且该类型未提供默认构造函数或拷贝操作,则需显式定义栈的构造函数或拷贝操作。
  2. 若栈需要特殊资源管理(如动态分配内存、文件句柄等),则需手动实现析构函数或拷贝控制成员(如拷贝构造函数、赋值运算符)。
  3. C++11 后的移动语义:若底层容器支持移动操作(如 std::vector),编译器会优先生成移动构造函数和移动赋值运算符,无需手动干预。

2.2.2常用函数的实现 

	template<class T, class Container>
	class queue
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}

		void pop()
		{
			_con.pop_front();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}

		T& front()
		{
			return _con.front();
		}

		const T& front()const
		{
			return _con.front();
		}

		const T& back()const
		{
			return _con.back();
		}

		T& back()
		{
			return _con.back();
		}
	private:
		Container _con;
	};

(1)入队出队

调用容器的尾插头删删函数即可

(2) 大小、长度

调用所封装的容器的相关函数即可

(3)队头队尾元素

vector(不推荐)\list都有back函数用于返回最后一个数据元素 

vector(不推荐)\list都有front函数用于返回第一个数据元素 

注意非const成员返回的数据元素不可修改!

3.完整源码+测试

#pragma once
#include <list>
namespace dfq2
{
	template<class T, class Container>
	class queue
	{
	public:
		void push(const T& val)
		{
			_con.push_back(val);
		}

		void pop()
		{
			_con.pop_front();
		}

		size_t size()
		{
			return _con.size();
		}

		bool empty()
		{
			return _con.empty();
		}

		T& front()
		{
			return _con.front();
		}

		const T& front()const
		{
			return _con.front();
		}

		const T& back()const
		{
			return _con.back();
		}

		T& back()
		{
			return _con.back();
		}
	private:
		Container _con;
	};

	void test_queue()
	{
		queue<int, list<int>> q;
		q.push(1);
		q.push(2);
		q.push(3);
		q.push(4);

		cout << q.size() << endl;

		while (!q.empty())
		{
			cout << q.front() << ' ';
			q.pop();
		}
		cout << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值