线性结构的应用-队列

作者: 黄一倚 | 来源:发表于2018-07-27 17:10 被阅读0次

    定义

    • 队列和栈一样,也是一种操作受限的线性表
    • 只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作
    • 进行插入操作的端称为队尾,进行删除操作的端称为队头

    特性

    • 先进先出(FIFO—first in first out):最早进入队列的元素最先从队列中删除

    分类

    静态队列:用数组实现
    动态队列:用链表实现

    用数组实现循环队列

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <stdbool.h>
    
    typedef struct Queue{
        int* pBase;
        int qFront;
        int qRear;
    }QUEUE;
    
    /**
        函数声明
    */
    void init_queue(QUEUE *); //初始化一个队列
    bool en_queue(QUEUE * pQueue,int element); //向队列插入一个元素
    void traverse_queue(QUEUE *);   //遍历一个队列
    bool isFull(QUEUE *);   //判断队列是否满
    bool isEmpty(QUEUE *);  //判断队列是否为空
    bool out_queue(QUEUE *,int *); //出队
    
    int main()
    {
        QUEUE Q;
        //测试 初始化队列
        init_queue(&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);
    
        //测试 遍历队列
        traverse_queue(&Q);
    
        //测试 出队
        int element;
        if(out_queue(&Q,&element)){
            printf("出队成功,出队的元素是:%d\n",element);
        }else{
            printf("出队失败!\n");
        }
        traverse_queue(&Q);
    
        return 0;
    }
    
    /**
        初始化一个队列
    */
    void init_queue(QUEUE * pQueue){
        //生成一个数组,并把首地址赋给pBase
        pQueue->pBase = (int *)malloc(sizeof(int)*6);
    
        //初始化前后位置
        pQueue->qFront=0;
        pQueue->qRear=0;
    
        return;
    }
    
    /**
        判断队列是否满
    */
    bool isFull(QUEUE *pQueue){
        //队列预留一个空存储空间,如果队尾指针加一取余数组长度 等于 队头指针,则队列为满
        //(pQueue->qFront+1)%6 == pQueue->qRear 这样写是错误的
        if((pQueue->qRear+1)%6 == pQueue->qFront)
            return true;
        else
            return false;
    }
    
    /**
        入队
    */
    bool en_queue(QUEUE * pQueue,int element){
        if(isFull(pQueue))
            return false;
    
        //插入元素
        pQueue->pBase[pQueue->qRear]=element;
        //队尾指针指向下一个存储单元
        pQueue->qRear = (pQueue->qRear + 1)%6;
    
        return true;
    }
    
    /**
        遍历一个队列
    */
    void traverse_queue(QUEUE * pQueue){
        int i = pQueue->qFront;
        //从队头开始遍历,如果遍历指针 等于 队尾指针,则遍历完成
        while(i != pQueue->qRear){
            printf("%d\t",pQueue->pBase[i]);
            i = (i+1)%6;
        }
        printf("\n");
    
        return;
    }
    
    /**
        判断队列是否空
    */
    bool isEmpty(QUEUE *pQueue){
        //当头尾指针指向同一个元素的时候,队列为空
        if(pQueue->qFront == pQueue->qRear)
            return true;
        else
            return false;
    }
    
    /**
        出队
    */
    bool out_queue(QUEUE *pQueue,int *pElement){
        if(isEmpty(pQueue))
            return false;
        //保存要删除的元素
        *pElement = pQueue->pBase[pQueue->qFront];
        //队头指针向后移
        pQueue->qFront = (pQueue->qFront+1)%6;
    
        return true;
    }
    
    

    相关文章

      网友评论

        本文标题:线性结构的应用-队列

        本文链接:https://www.haomeiwen.com/subject/chygmftx.html