线性结构的应用-队列

定义

  • 队列和栈一样,也是一种操作受限的线性表
  • 只允许在表的前端(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;
}

    原文作者:桓宇Harry
    原文地址: https://www.jianshu.com/p/519a2f578bf4#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞