111.C++队列queue

发布时间 2023-07-21 10:37:07作者: CodeMagicianT

111.C++队列queue

1.queue的简介

queue的中文译为队列,队列是一种数据结构。C语言中队列的定义及初始化以及一些相关操作实现起来较为繁琐,而C++的queue让这些都变得简便易实现。因为C++中有着许多关于queue的方法函数。
队列(queue)最大的特点就是先进先出。就是说先放入queue容器的元素一定是要先出队列之后,比它后进入队列的元素才能够出队列。

使用queue时需要包含头文件:

#include<queue>

2.queue初始化

格式:

queue<Type, Container> (<数据类型,容器类型>)

初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型

例子:

queue<int> q;  //使用默认的双端队列为底层容器创建一个空的queue队列对象q,数据元素为int类型。
queue<int> q[20];  //规定队列元素数量
queue<int,list<int>> q1;
queue<int,list<int>> q2(q1);
/*复制构造函数(queue(const queue&)),用一个queue对象创建新的queue对象。 
利用queue对象q1,创建一个以双向链表为底层容器的queue对象q2*/

注意:不能用vector容器初始化queue

因为queue转换器要求容器支持front()、back()、push_back()及 pop_front(),说明queue的数据从容器后端入栈而从前端出栈。所以可以使用deque(double-ended queue,双端队列)和list对queue初始化,而vector因其缺少pop_front(),不能用于queue。

3.queue中常用的函数

●front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue为空,返回值是未定义的。
●back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue
为空,返回值是未定义的。
●push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back()来完成的。
●push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数push_back() 来完成的。
●pop():删除 queue 中的第一个元素。
●size():返回 queue 中元素的个数。
●empty():如果 queue 中没有元素的话,返回 true。
●emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
●swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

示例代码:

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q1; //定义一个数据类型为int的queue 

	//向队列中加入元素
	q1.push(1);
	q1.push(2); 
	q1.push(3); 
	q1.push(4); 
	queue<int> q2(q1);

	cout << "q1队列中的元素个数为:" << q1.size() << endl;
	//判断队列是否为空 
	if (q1.empty())
	{
		cout << "q1队列为空" << endl;
	}
	else
	{
		cout << "q1队列不为空" << endl;
	}
	cout << "q1队列的队首元素为:" << q1.front() << endl;
	cout << "q1队列的队尾元素为:" << q1.back() << endl;
	//队列中的队首元素出队 
	q1.pop();
	cout << "将q1队列队首元素出队后,现在队列中的元素为2、3、4" << endl;

	// 读取q2队列的头部元素  
	cout << "q2队列的头部元素是:" << q2.front() << endl;

	// 读取q2队列的尾部元素  
	cout << "q2队列的尾部元素是:" << q2.back() << endl;

	//q2调用emplace()
	q2.emplace(5);
	// 遍历队列中的所有元素  
	cout << "q2队列中的所有元素是:";
	while (!q2.empty())
	{
		cout << q2.front() << " ";
		q2.pop();
	}
	cout << endl;
	
	queue<int> q3,q4; //定义一个数据类型为int的queue 

	//向队列中加入元素
	q3.push(1);
	q3.push(2);
	q3.push(3);
	q3.push(4);

	q4.push(5);
	q4.push(4);
	q4.push(3);
	q4.push(2);
	q4.push(1);

	q3.swap(q4);
	// 遍历队列中的所有元素  
	cout << "q3队列中的所有元素是:";
	while (!q3.empty())
	{
		cout << q3.front() << " ";
		q3.pop();
	}
	cout << endl;

	cout << "q4队列中的所有元素是:";
	while (!q4.empty())
	{
		cout << q4.front() << " ";
		q4.pop();
	}
	cout << endl;

	return 0;
}

运行结果:

将元素1、2、3、4一一加入队列中后,队列中现在的元素为:1、2、3、4
队列中的元素个数为:4
队列不为空
队列的队首元素为:1
队列的队尾元素为:4
将队列队首元素出队后,现在队列中的元素为2、3、4

参考:陈童学哦