浅谈队列

Posted guohaoblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈队列相关的知识,希望对你有一定的参考价值。

《啊哈,算法》的第2章-----队列

这一章通过一个qq号解密的例子引出了队列,并通过代码实现了解密过程。本文主要讲解qq号这个例子并用c语言实现

关于队列的讲解可以查看博客:https://blog.csdn.net/zhongguozhichuang/article/details/53196415

------------------------------------------------------------------------------------------------------------------------

问题描述:现在给一串数字,例如6 3 1 7 5 8 9 2 4,按照以下规则转换得到相应的序列,并输出

具体规则为:首先将第1 个数删除,紧接着将第2 个数放到这串数的末尾,再将第3 个数删除并将第4 个数放到这串数的末尾,再将第5 个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起,输出就是转换后的序列。

以上述为例:刚开始这串数是“6 3 1 7 5 8 9 2 4”,首先删除6 并将3 放到这串数的末尾,这串数更新为“1 7 5 8 9 2 4 3”。接下来删除1 并将7 放到末尾,即更新为“5 8 9 2 4 3 7”。再删除5 并将8 放到末尾即“9 2 4 3 7 8”,删除9 并将2 放到末尾即“4 3 7 8 2”,删除4 并将3 放到末尾即“7 8 2 3”,删除7 并将8 放到末尾即“2 3 8”,删除2 并将3 放到末尾即“8 3”,删除8 并将3 放到末尾即“3”,最后删除3。因此被删除的顺序是“6 1 5 9 4 7 2 8 3”

技术分享图片

在不使用队列的时 具体代码如下:

#include<stdio.h>
#define N 101

/*
* brief:解密qq号
* example:
*  input: 6 3 1 7 5 8 9 2 4
* output:6 1 5 9 4 7 2 8 3
*/ int main() { int qq[N]={0}; int head,tail,i=1,len=0; printf("请输入您的qq号:"); do { scanf("%d",&qq[i++]); len++; }while(getchar()!= ); head = 1; // 指向队头 即 第一个元素 tail = len+1; // 指向队尾的下一个元素 while(head < tail) { // 第一个元素删除 即 出队 printf("%d ",qq[head]); head ++; // 队头右移 qq[tail++] = qq[head]; // 将head指向的元素放在队尾 并且使tail向后移动一位 head ++; // 队头再次右移一位 , 完成一次循环操作 } return 0; }

上面的这个例子根据队列的思想借用静态数组模拟进队出队操作,以下再看看采用结构体--队列,实现的代码吧

#include<stdio.h>
#define N 101

// 采用队列解密

typedef struct queue{
    int data[N];
    int head;
    int tail;
}Queue;

int main()
{
    Queue q;
    int i;
    // 初始化队列
    q.head = 1;
    q.tail = 1;
    
    for(i=1;i<10;++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++;         
    }
    
    return 0;
} 

当然。,队列不仅仅可以采用数组存储也可以采用链表(数据结构这本书里有详细的介绍,可以查阅相关书籍)。本文仅仅是为了学习队列写的上述代码,难免显的没第一个简洁。以后在做相关练习时,适合自己的风格就行,哪好用用哪个。有什么疑问,欢迎拍砖

 






以上是关于浅谈队列的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

# Java 常用代码片段

浅谈JS异步(asychrouous)

浅谈PHP数据结构之队列

浅谈Mybatis

浅谈RabbitMQ——死信队列与延迟队列