1.知识百科
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队尾(rear):只能从队尾添加元素,一般焦作enQueue,入队
队头(front):只能从队头移除元素,一般焦作deQueue,出队
先进先出的原则、First In Fist Out,FIFO(跟栈是反的,栈是后进先出)
在生活中队列案例也是随处可见。例如火车站排队买票,银行排队办理业务。
2.C++队列容器queue
队列只需要从对尾插入数据(入队,push_back),对头取数据(出队,pop_front);
队列只能访问对头和队尾数据,其他数据需要出队才能访问,所以不存在遍历队列;
返回队列头数据:front()
返回队列尾数据:back()
2.1 queue构造函数
- 默认构造
queue que- 拷贝构造函数
queue(const queue &que)
2.2 入队和出队函数
- 入队
push()
emplace()- 出队
pop()
2.3 其他相关函数
- 获取队列头数据
front()- 获取队列尾数据
back()- 判断队列是否为空
empty();- 获取队列中元素个数
size();- 互换元素:
swap();
’注意:queue容器不支持随机访问,不能通过下标访问元素;不支持迭代器访问元素,仅能通过front和back来访问一个元素和最后一个元素;
3.C++队列使用示例
3.1示例1:使用内置数据类型
#include <iostream>
#include <queue>
using namespace std;
void test()
{
queue<int> q;
//入队
q.push(10);
q.push(20);
q.push(30);
q.emplace(40);//从队列尾插入数据
cout << "队列中成员个数:" << q.size() << endl;
while (!q.empty())//判断队列是否为空
{
cout << "队列头:" << q.front() << "\t队列尾:" << q.back() << endl;
q.pop();//出队
}
cout << "队列中成员个数:" << q.size() << endl;
}
int main()
{
test();
system("pause");
}
3.2示例2:使用构造数据类型
#include <iostream>
#include <queue>
#include <stdlib.h>
using namespace std;
class Person
{
public:
int age;
string name;
//构造函数
Person(int age,string name):age(age),name(name){
}
};
//重载<<
ostream& operator<<(ostream&,Person p)
{
cout<<"姓名:"<<p.age<<"\t"<<"年龄"<<p.name;
return cout;
}
void test()
{
queue<Person> q1;
queue<Person> q2;
//入队操作
q1.emplace(12,"小王");
//q1.push(13,"小刘");//错误,push需要实例化对象
q1.push(Person(13,"小刘"));
Person p(25,"阿水");
q1.emplace(p);//emplace既可以直接填构造函数形参,也可以实例化对象填入
//q2入队操作
q2.push(p);
q2.emplace(25,"安安");
cout<<"队列q1成员个数:"<<q1.size()<<endl;
cout<<"队列q2成员个数:"<<q2.size()<<endl;
//交换
cout<<"交换成员后:"<<endl;
q1.swap(q2);
cout<<"队列q1成员个数:"<<q1.size()<<endl;
cout<<"队列q2成员个数:"<<q2.size()<<endl;
//q1出队
cout<<"q1出队:"<<endl;
while(!q1.empty())
{
cout<<"q1队列头内容:"<<q1.front()<<endl;
cout<<"q1队列尾内容:"<<q1.back()<<endl;
cout<<endl;
q1.pop();//出队
}
//q2出队
cout<<"q2出队:"<<endl;
while(!q2.empty())
{
cout<<"q2队列头内容:"<<q2.front()<<endl;
cout<<"q2队列尾内容:"<<q2.back()<<endl;
cout<<endl;
q2.pop();//出队
}
}
int main()
{
test();
system("pause");
}