队列的定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。它允许在表的一端插入数据,在另一端删除元素。插入元素的这一端称之为队尾。删除元素的这一端我们称之为队首。它的特点是数据元素先进先出(FIFO),类似于排队取票(买到票的在队伍前面,要离开队伍,与删除操作类似;没买到票的在队伍后面,新来的人在队尾,与插入操作类似)。
附简图:
Head | ....... | ...... | ...... | Tail |
C A B
则C从head处离开,若有新来的D,则跟着Tail处的B进来。

(打饭先到先得,不能插队!)
PS:为了避免head与tail重合,我们令tail记录队尾的下一个位置。
实际上,queue也可作为一个结构体类型:
struct queue
{ int data[1000];//队列主体,用于存放数据
int head;//队首
int tail;//队尾
};一.不使用C++中STL库函数对队列进行操作(创建、入队、出队)
#include<iostream>
#include<algorithm>
#include<queue>
struct queue
{ int data[100];
int head;
int tail;
};
int main()
{ struct queue q;
int i;
//初始化队列
q.head=1;
q.tail=1;
for(i=1;i<10;i++)
{ scanf("%d",&q.data[q.tail]);//依次向队列中插入9个数
q.tail++;
}
while(q.head<q.tail) //当队列不为空的时候执行循环
{
//打印队首并将队首出队(等同于没有q.data[1])
printf("%d",q.data[q.head]);
q.head++;
//先将新的队首的数添加到队尾
q.data[tail]=q.data[head];
q.tail++;//将队首出队
}
return 0;
}由上述代码可知,我们只能对队列的head和tail进行访问,因此队列不能用for等循环语句进行遍历
二:C++STL中queue的常见接口(内置函数)
构造函数:
queue<T> que;//queue采用模板类实现,queue对象的默认构造形式
queue(const queue &que);//拷贝构造函数
赋值操作:
queue& operator=(const queue &que);//重载等号操作符数据存取:
push(elem);//向队尾添加元素(类似于v.push_back())
pop();//从队首删除第一个元素
back();//返回队尾值
front();//返回队首值
大小操作:
empty();//判断堆栈是否为空
size();//返回栈的大小实例操作:
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
//队列 queue
void test11()
{ queue<int> q;//创建queue
//准备数据
int a[5];
for(int i=0;i<5;i++)
{ a[i]=i;
}//对a[10]中的每个元素进行赋值
//入队
q.push(a[0]);
q.push(a[1]);
q.push(a[2]);
q.push(a[3]);
q.push(a[4]);
printf("队列大小为: ",q.size());
//判断只要队列不为空,查看队头,查看队尾,出队
while(!q.empty)//队列不为空时
{ printf("%d",q.front());//查看队首
printf("%d",q.back());//查看队尾
q.pop();//出队
printf("队列大小为: ",q.size());//查看队列大小
}
}
int main()
{ test11()
return 0;
}
//PS:queue与vector不同,不提供迭代器,更不支持随机访问
/*常用接口总结:
push-----入队
pop------出队
front-------返回队首元素
back--------返回队尾元素
empty-------判断队列是否为空
size--------返回队列的大小
*/
版权声明:本文为weixin_63714970原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。