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");
}