数据结构再学习--队列

来源:互联网 发布:js校验身份证号 编辑:程序博客网 时间:2024/04/30 12:22

队列遵循着先入先出的原则,由一个线性表和两个保存头尾索引的变量组成,为了节省空间和提高效率,可以把队列做成循环队列。使得移除的数据留下的空间可以循环利用,而仅仅失去一个位置用来处理判断队列是否为满。

下面是队列和循环队列的实现


// 普通的队列void initXBQueue(XBQueue*q)//初始化队列{    q->front=-1;    q->rear=-1;}int isXBQueueEmpty(XBQueue*q)//判断队列是否空{    if(q->front==q->rear)    {        return YES;    }    else    {        return NO;    }}int isXBQueueFull(XBQueue*q)//判断是否满了{    if(q->rear==MAX_SIZE-1)    {        printf("队列已经满了,不能进入队列操作\n");        return 1;    }    else    {        return 0;    }    }int getXBQueueLength(XBQueue q)//获取长度{    return (q.rear-q.front);}int insertXBQueue(XBQueue*q,DATATYPE m)//插入元素{    if(isXBQueueFull(q))        return 0;    q->rear=q->rear+1;    q->qm[q->rear]=m;    return 1;}int delXBQueueItem(XBQueue*q,DATATYPE *e){    if(isXBQueueEmpty(q))return 0;    q->front=q->front+1;    *e=q->qm[q->front];    return 1;}void printXBQueue(XBQueue q){    int i;    printf("队列的元素是:\n");    for(i=q.front+1;i<=q.rear;i++)    {        printf("%d",q.qm[i]);    }    printf("\n");}// -----循环队列// 循环队列初始化的时候可以设置,头指针和尾指针可以设置为0,不能设置为-1,否则循环部分计算复杂.void initXBLoopQueue(XBLoopQueue*q)//初始化队列{    q->front=0;    q->rear=0;}//相等的条件判断没有变化int isXBLoopQueueEmpty(XBLoopQueue*q)//判断队列是否空{    if(q->front==q->rear)    {        return YES;    }    else    {        return NO;    }}int isXBLoopQueueFull(XBLoopQueue*q)//判断是否满了{    if (q->front==0&&q->rear==M-1) {//这是一直插入但是没有取出的情况,所以最后一个位置无法存储元素。。        return YES;    }    if (q->rear%M==q->front-1) { //这是出现了循环        return YES;    }    return NO;}int getXBLoopQueueLength(XBLoopQueue q)//获取长度{    if (q.front<q.rear%M) {        return q.rear - q.front;    }    else    {      return  M-q.front+q.rear;//这里处理循环的情景    }}int insertXBLoopQueue(XBLoopQueue*q,DATATYPE m)//插入元素{    if(isXBLoopQueueFull(q)){        return NO;    }    q->qm[q->rear]=m;    q->rear=(q->rear+1)%M;    return YES;}int delXBLoopQueueItem(XBLoopQueue*q,DATATYPE *e){    if(isXBLoopQueueEmpty(q))return NO;    *e=q->qm[q->front];    q->front=(q->front+1)%M;    return YES;}void printXBLoopQueue(XBLoopQueue q){    printf("队列的元素是:\n");    while (!isXBLoopQueueEmpty(&q)) {        DATATYPE e;        delXBLoopQueueItem(&q, &e);        printf("%d  ",e);    }    printf("\n");}





0 0
原创粉丝点击