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);
    }
  • 相关阅读:
    图解AVL树
    浅析Java7中的ConcurrentHashMap
    浅析CopyOnWriteArrayList
    浅析CAS与AtomicInteger原子类
    IDEA左侧不以树形结构展示项目结构
    maven常见问题
    Mybatis实现多表联合查询
    Mybatis实现单表增删改查操作
    解决mybaits配置错误:Cause: org.xml.sax.SAXParseException; lineNumber: 17; columnNumber: 119; 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
    Deepin_运维实践系列博客导航
  • 原文地址:https://www.cnblogs.com/qxj511/p/5223202.html
Copyright © 2011-2022 走看看