队列

队列将是今后学习广度优先搜索以及队列优化的 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; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值