• 数据结构_郝斌_队列


    线性结构的两种常见应用之二 队列

    定义

    • 一种可以实现“先进先出”的内存结构

    分类

    1. 链式队列 --用链表实现
    2. 静态队列 --用数组实现,静态队列通常都必须是循环队列

    循环队列的的讲解

    1.静态队列为什么必须是循环队列

    2.循坏队列需要几个参数来确定

     需要两个参数来确定:front/rear

    3.循环队列各个参数的含义

     两个参数不同场合有不同的含义

    • 建议初学者先记住,然后慢慢体会
       (1) 队列初始化:front/rear的值都是零
       (2)队列非空:front代表的是队列的第一个元素,rear代表的是队列的最后一个有效元素的下一个元素。
       (3)队列空:front/rear的值相等,但不一定是零

    4.循环队列入队伪算法讲解

     (1)将值存入rear所代表的位置
     (2)错误的写法:rear = rear + 1;正确的写法:rear = (rear + 1)%数组的长度

    5.循环队列出队伪算法讲解

    • front = (front + 1)%数组的长度

    6.如何判断循环队列是否为空

    • 如果front与rear的值相等,则该队列就一定为空

    7.如何判断循环队列是否已满

     (0)预备知识:front的值可能比rear大,front的值也可能比rear小,当然也可能两者相等。

     (1)多增加一个标志位参数(记录队列长度)
     (2)少用一个元素

    //如果r和f的值紧挨着,则队列已满(C语言伪算法)
    if( (r+1)%数组长度 == f )
    已满
    else
    不满
    

    队列算法

    • 入队
    • 出队

    队列的具体应用

    • 所有和时间有关的操作都与队列的影子

    代码

    //循环队列.cpp
    #include <stdio.h>
    #include <malloc.h>
    #include <stdlib.h>
    
    typedef struct Queue
    {
        int * pBase;
        int front;
        int rear;
    }QUEUE;
    
    //函数声明
    void init(QUEUE *);
    bool en_queue(QUEUE *, int val);
    void traverse_queue(QUEUE *);
    bool full_queue(QUEUE *);
    bool out_queue(QUEUE *, int *);
    bool empty_queue(QUEUE *);
    
    int main(void)
    {
        QUEUE Q;
        int val;
    
        init(&Q);
        en_queue(&Q,1);
        en_queue(&Q,2);
        en_queue(&Q,3);
        en_queue(&Q,4);
        en_queue(&Q,5);
        en_queue(&Q,6);
        en_queue(&Q,7);
        en_queue(&Q,8);
        traverse_queue(&Q);
        if(out_queue(&Q, &val) )
        {
            printf("出队成功,出队的元素是 :%d
    ", val);
        }
        else
        {
            printf("出队失败!");
        }
        
    
        system("pause");
        return 0;
    }
    
    void init(QUEUE *pQ)
    {
        pQ->pBase = (int*)malloc(sizeof(int) * 6);
        pQ->front = 0;
        pQ->rear = 0;
    }
    
    bool full_queue(QUEUE * pQ)
    {
        if( (pQ->rear + 1) % 6 == pQ->front )
        return true;
        else
        {
            return false;
        }
        
    }
    
    bool en_queue(QUEUE * pQ, int val)
    {
        if( full_queue(pQ) )
        {
            return false;
        }
        else
        {
            pQ->pBase[pQ->rear] = val;
            pQ->rear = (pQ->rear+1) % 6;
    
            return true;
        }
        
    }
    
    void traverse_queue(QUEUE * pQ)
    {
        int i = pQ->front;
    
        while(i != pQ->rear)
        {
            printf("%d ", pQ->pBase[i] );
            i = (i + 1) % 6;
        }
        printf("
    ");
    
        return;
    }
    
    bool empty_queue(QUEUE * pQ)
    {
        if( pQ->front == pQ->rear)
        return true;
        else
        {
            return false;
        }
        
    }
    
    bool out_queue(QUEUE * pQ, int * pVal)
    {
        if( empty_queue(pQ) )
        {
            return false;
        }
        else
        {
            *pVal = pQ->pBase[pQ->front];
            pQ->front = (pQ->front+1) % 6;
    
            return true;
        }
        
    }
    
    

    本文来自博客园,作者:小恒2020,转载请注明原文链接:https://www.cnblogs.com/xiaoheng2020/p/12679823.html

  • 相关阅读:
    P1168 中位数(对顶堆)
    P2341 [HAOI2006]受欢迎的牛
    P1967 货车运输
    树状数组的神操作QAQ
    P1063 能量项链
    P1429 平面最近点对(加强版)
    P2571 [SCOI2010]传送带
    4 Values whose Sum is 0
    UVA529 Addition Chains
    UVA307 Sticks
  • 原文地址:https://www.cnblogs.com/xiaoheng2020/p/12679823.html
Copyright © 2020-2023  润新知