队列将是今后学习广度优先搜索以及队列优化的 Bellman-Ford 短路算法的核心数据结构。
本文章通过一个小小的故事来说明队列的应用及其队列的意义:
A告诉B一串数字并且告诉B解密规则,让B界闯出QQ号是多少,现在这串数字是6 3 1 7 5 8 9 2 4
然后解密的规则是:首先将第 1 个数删除,紧接着将第 2 个数放到这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串数的末尾,再将第 5 个数删除…… 直到剩下 后一个数,将 后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小A的 QQ 啦。
来看一下,解密之后是6 1 5 9 4 7 2 8 3。
其实解密的过程就像是给这些数字排队,每次从前面拿掉两个然后第一个扔掉(留下),然后第二个放在队伍的最后面。
如果用程序来实现呢??我可以创建一个数组来储存,int n[11]={631758924} //初始化
删除第一个数字的最简单的方法就是把所有的数字都往前挪一步,进行覆盖,这样才能吧第一个数删除,但是耗费时间,
在这里,我将引入两个整型变量 head 和 tail。head 用来记录队列的队首(即第一位), tail 用来记录队列的队尾(即 后一位)的下一个位置。你可能会问:为什么 tail 不直接记录队尾,却要记录队尾的下一个位置呢?这是因为当队列中只剩下一个元素时,队首和队尾重合会带来一些麻烦。我们这里规定队首和队尾重合时,队列为空。
然后呢?把数据在数组中进行储存之后,让head=1,,tail=10,这样的话在head和tail之间的数字即是有效数字,
在进行删除第一个数字的时候,只需要head++就可以了不是吗?新增一个数只需要tail++就可以了,大大减少时间复杂度。
实现代码如下:
#include<stdio.h>
int main()
{
int s[11]={0631758924},head=1,tail=10;
while(head<tail)
{
printf("%d",n[i]);
head++;
s[tail]=s[head];
tail++;
head++;
}
return 0;
这就是队列的简单解释。
总结一下:队列是一种特殊的线性结构,她只允许在首部进行删除操作<出对>,在尾部进行插入操作<入队>,在没有元素的时候(head==tail)这个时候就是空队列。遵守先进先出的规则,犹如生活中的排队买票。
队列将是我们今后学习广度优先搜索以及队列优化的 Bellman-Ford 短路算法的核心数据结构。
可以将队列封装为一个结构体类型:
struct queue
{
int data[100];//队列的主体,用来存储内容
int head;//队首
int tail;//队尾
};
用上结构体之后的代码:
#include <stdio.h> 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<=9;i++)
{
//依次向队列插入9个数
scanf("%d",&q.data[q.tail]);
q.tail++;
}
while(q.head<q.tail) //当队列不为空的时候执行循环
{
//打印队首并将队首出队
printf("%d ",q.data[q.head]);
q.head++;
//先将新队首的数添加到队尾
q.data[q.tail]=q.data[q.head];
q.tail++;
//再将队首出队
q.head++;
} getchar();getchar(); return 0;
}