基本概念:
queue是一种先进先出的数据结构。
有两个开口,一个开口只用于进队(push,添加数据),一个开口只用于出队(pop,移除数据)。
队列中只有队头(front,出口处)、队尾(back,入口处)两个元素可以被外界使用,因此队列没有遍历操作。
接下来学习队列的 常用接口:
构造函数:
queue<T> que;//queue对象的默认构造形式,采用模板类实现
queue(const queue &que);//拷贝构造函数,所有适配器都支持
赋值操作:
queue& operator=(const queue &que);//重载等号操作符
数据存取:
push(elem);//往队尾添加元素,即入队
pop();//从队头移除第一个元素,即出队
back();//返回队尾,即最后一个元素
front();//返回队头,即第一个元素
大小操作:
empty();//判断堆栈是否为空,所有适配器都支持
size();//返回栈的大小,所有适配器都支持
数据交换:
swap(a,b);//交换a和b的内容,所有适配器都支持
a.swap(b);//a和b必须类型相同,底层容器类型也必须相同
接下来通过测试案例来体会这些接口的使用:
#include<iostream>
#include<queue>
using namespace std;
struct people//自定义数据类型
{
string name;
int age;
people(string Name,int Age)
{
name=Name;
age=Age;
}
void print()
{
cout<<name<<" "<<age<<endl;
}
};
void test()
{
queue<people> q1;
if(q1.empty())//检验是否为空
cout<<"q1为空"<<endl;
else cout<<"q1非空"<<endl;
cout<<"size of q1:"<<q1.size()<<endl;//查看q1大小
q1.push(people("张三",20));//准备数据
q1.push(people("李四",17));
if(q1.empty())//检验是否为空
cout<<"q1为空"<<endl;
else cout<<"q1非空"<<endl;
cout<<"size of q1:"<<q1.size()<<endl;//验证push操作会改动数据
people p1(q1.front()),p2(q1.back());//取出q1队头、队尾
cout<<"q1队头:";//输出确认
p1.print();//应是张三
cout<<"q1队尾:";
p2.print();//应是李四
cout<<"size of q1:"<<q1.size()<<endl;//验证取出队头、队尾不会改动数据
q1.pop();//出队一个元素
cout<<"size of q1:"<<q1.size()<<endl;//验证pop操作会改动数据
queue<people> q2(q1);//使用拷贝构造
cout<<"size of q2:"<<q2.size()<<endl;//应为1
q2.push(p1);//入队一个元素
swap(p1,p2);
cout<<"q2队头:";//输出验证push操作入队的元素不是传入元素的引用(本身)
(q2.front()).print();//顺便验证front、back操作都是队内返回元素本身(引用)
cout<<"q2队尾:";
(q2.back()).print();//应为李四、张三
swap(q1,q2);//验证队列交换效果
cout<<"q1队头:";
(q1.front()).print();
cout<<"q1队尾:";
(q1.back()).print();
cout<<"q2队头:";
(q2.front()).print();
cout<<"q2队尾:";
(q2.back()).print();
}
int main()
{
test();
return 0;
}
代码运行结果:
此外,还发现一个有趣现象:在队列刚被创建还是空队列的时候,虽然调用size返回的值是0,但是队列的底层却有很大的空间(在我的电脑上是显示有1000个位置),就算调用拷贝构造函数,在定义语句没执行完前,队列内部的空间也是特别大,直到有元素入队,队列内部才具体化,有明确的大小,而且因为队列不允许遍历操作,所以调试模式下队列的元素的值不可见。不过这个超大的空间只在定义语句为执行完时可见。
q1定义语句未执行完时q1的状态。
用图说明这个超大空间有多大。
随后这个超大空间就不可见了。
q1有元素入队后。
调用拷贝构造的q2未执行完定义语句前的状态。
执行完后。
把q2清空以验证超大空间不可见。