一.队列的概念
1.只允许在一端插入数据操作,在另一端进行删除数据操作的特殊线性表;
2.进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列);
3.队列具有先进先出(FIFO)的特性。
对于队列最形象的比喻就是排队了:最先结束排队的肯定是最先开始排队的人,那么后到的人肯定要站在队伍的最后面,当然队列是不允许插队的。
二.队列的实现方法
1.数组模拟
开一个数组用来模拟队列,对于队列,我们要知道队列的首和尾的位置,这样我们才能够进行后面的入队和出队的操作,所以我们要用两个数来记录队列的首尾位置,然后对队列进行操作.
例子:
1 19
1 16
2
1 21
2
1 40
2
2
对应队列的操作应该是:
红色代表这个元素已经出队列;
黑色代表这个元素还在队列中;
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int queue[101];
int head=0,tail=0;
int x,y;//x为队列进行的操作,当x=1时,代表进队列;当x=2时代表出队列;
//y代表进队列的数据;
while(~scanf("%d",&x))
{
if(x==1)//进队列的操作;
{
scanf("%d",&y);
queue[tail]=y;//队列的性质是队为插入元素;
tail++;//队列的尾巴长度增加;
}
else//出队列的操作;
{
if(head<tail)//队列不为空;
{
printf("出队列:%d\n",queue[head]);//队列的性质是队首出队列;
head++;
}
}
}
return 0;
}
测试输出:
2.使用queue函数
a.queue队列函数:
你可以申请一个队列,那样就不用你自己去控制队列的首尾位置了;
还要注意使用的头文件:
#include<queue>
using namespace std;
队列的申请方法:queue<A>Q;,其中Q代表队列的名称,A则是队列中存放的元素的类型;
整型(int)queue<int>Q;
浮点型(float,double)queue<float>Q,queue<double>Q,
字符型(char)queue<char>Q,
字符串(string)queue<string>Q,
结构体(node(结构体的名称))queue<node>Q;
b.队列中的操作
进队:Q.push(a); Q为队列名称,a为要入队列的元素;
出队列:Q.pop(); Q为队列的名称;
判断是否为空:Q.empty(); Q为队列的名称,当队列为空的时候返回值为1,队列不为空的时候返回值为0;
查询队列现在拥有的元素个数:Q.size(); Q为队列的名称,返回值为队列中元素的个数;
代码如下:
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int main()
{
queue<int>Q;//申请一个int类型的队列
int x,y;
while(~scanf("%d",&x))
{
if(x==1)//是进队列的操作;
{
scanf("%d",&y);
Q.push(y);//进队列;
}
else
{
int k=Q.front();//取出队首的元素;
printf("出队列:%d\n",k);
Q.pop();//把队首元素出队列;
}
printf("队列有 %d 个元素\n",Q.size());//查询队列中元素的个数;
int s=Q.empty();//判断队列是否为空;
if(s==0)
printf("队列非空\n");
else
printf("队列为空\n");
}
return 0;
}
运行截图: