zoukankan      html  css  js  c++  java
  • 循环队列

    队列是一种特殊的线性表,与堆、栈有点类似,但是队列值允许从队列的前端(Front)进行出队(删除),队列的后端进行插入(进队)。

    实际的应用中,使用的是循环的队列。

    循环队列的本质:是一个数组,只不过这个数组是可以被循环地进行存放数据。

    2、循环队列的创建

    typedef struct Queue
    {
        int *pBase;
        int Front;
        int Rear;
    }QUQUQ,*PQUEUE;

    pBase : 指针,指向的是数组地址

    Front : 指向的是队列的一个存放元素的单元,出队也是这里进行出队哦、

    Rear:指向的是队列存放元素最后一个单元的下一个单元,这里进行进队。所以说,N 个单元循环队列(数组),只能保存 N-1 数据。

    当循环队列是空的时候, Front 等于 Rear,而为满的时候,Front = (Rear + 1)%N;d

    3、代码

    typedef struct Queue
    {
        int *pBase;
        int Front;
        int Rear;
    }QUQUQ,*PQUEUE;
    
    
    // 循环队列的初始化
    void init_queue(PQUEUE pTR)
    {
    
        pTR->pBase = (int *)malloc(sizeof(int) * 6);
        // 进队和出队指向同一个位置
        pTR->Rear = pTR->Front = 0;
    
    }
    
    // 判断是否队列已经满了
    bool is_full_queue(PQUEUE pTr)
    {
        PQUEUE pNew = pTr;
    
        if ( pNew->Front == (pNew->Rear + 1) % 6)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    
    void insert(PQUEUE pTr, int iVal)
    {
        PQUEUE pNew = pTr;
        if (is_full_queue(pTr))
        {
            printf("满的队列,不能插入咯
    ");
        }
    
        pNew->pBase[pNew->Rear] = iVal;
        pNew->Rear = (pNew->Rear + 1) % 6;
    
    }
    
    
    // 遍历循环队列
    void traver_queue(PQUEUE pTr)
    {
        int i = pTr->Front;
        while (i != pTr->Rear)
        {
            printf("%d
    ", pTr->pBase[i]);
            i = (i + 1) % 6;
        }
    }
    
    
    // 判断队列是否为空
    bool is_empty_queue(PQUEUE pTr)
    {
        if ( pTr->Front ==  pTr->Rear)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    
    // 出队的操作
    void out_queue(PQUEUE pTr)
    {
        PQUEUE pNew = pTr;
        
        if (is_empty_queue(pNew))
        {
            printf("空队列");
            exit(-1);
        }
    
        printf("出队的数据是:%d", pNew->pBase[pNew->Front]);
        pNew->Front = (pNew->Front + 1) % 6;
    
    }
    
    
    int main(int argc, char **argv)
    {
        // 创建一个队列
        QUQUQ QQ;
    
        init_queue(&QQ);
    
        // 入队
        insert(&QQ, 1);
        insert(&QQ, 2);
        insert(&QQ, 3);
        insert(&QQ, 4);
        insert(&QQ, 5);
    
        // 遍历队列
        traver_queue(&QQ);
    
        // 出队
        out_queue(&QQ);
    
    
        while (1);
    }
  • 相关阅读:
    机器学习笔记之K近邻算法
    [C++基础]在子类中向父类的构造函数传递参数的小例子,包括类中常量的初始化
    POJ2709 染料贪心
    POJ2337 欧拉路径字典序输出
    POJ2337 欧拉路径字典序输出
    POJ1042 贪心钓鱼
    POJ3228二分最大流
    POJ3228二分最大流
    POJ3498最大流,枚举终点,企鹅,基础最大流
    POJ3498最大流,枚举终点,企鹅,基础最大流
  • 原文地址:https://www.cnblogs.com/qxj511/p/5223202.html
Copyright © 2011-2022 走看看