目录
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::list、std::deque)来管理数据存储,因此栈对象的构造、拷贝、移动和析构等操作通常无需手动实现。编译器会自动调用底层容器的对应构造函数、拷贝/移动构造函数以及析构函数,生成默认的成员函数。但需注意以下特殊情况:
- 若底层容器是自定义类型(如用户定义的容器类),且该类型未提供默认构造函数或拷贝操作,则需显式定义栈的构造函数或拷贝操作。
- 若栈需要特殊资源管理(如动态分配内存、文件句柄等),则需手动实现析构函数或拷贝控制成员(如拷贝构造函数、赋值运算符)。
- 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;
}
}

4480

被折叠的 条评论
为什么被折叠?



