• 浅谈队列


    《啊哈,算法》的第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;
    } 

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

  • 相关阅读:
    day4
    cache用法
    Excel批量生成SQL语句,处理大量数据(增,改)
    IDEA中Maven依赖下载失败解决方案
    IDEA 自动生成类图 UML
    springboot报错说 Failed to parse multipart servlet request; nested exception is java.io.IOException
    controller层的引用service层一直报空指针问题
    CONCATENATE函数
    AQS
    String 类和常量池
  • 原文地址:https://www.cnblogs.com/guohaoblog/p/9216024.html
Copyright © 2020-2023  润新知