ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于 循环队列

2022-04-01 09:35:38  阅读:164  来源: 互联网

标签:return 队列 Maxsize 循环 关于 front rear


这篇博客主要总结一下循环队列的顺序存储方式

#define M 100 //最大队列长度
Typedef struct 
{
    QElemType *base; //初始化的动态分配存储空间
    int front; //头指针 
    int rear; //尾指针
}SqQueue;

 

队列的基本操作:

InitQueue (&Q)           //构造空队列
DestroyQueue (&Q)        //销毁队列
ClearQueue (&S)          //清空队列
QueueEmpty(S)            //判空
QueueLength(Q)           //取队列长度
GetHead (Q,&e)           //取队头元素
EnQueue (&Q,e)           //入队列
DeQueue (&Q,&e)          //出队列
QueueTraverse(Q,visit()) //遍历

 

在此时继续入队会出现什么情况?

假溢出。什么是假溢出?当队尾指针达到数组上届,即使队列未满,也不能再做入队操作。

那么我们如何解决假溢出?将存储队列的数组头尾相接(注:不存在物理的循环结构),也就是我们所说的可以循环的队列。

此时,

rear=(rear+1)%Maxsize

 

如何判断循环队列队空?

front=rear

 


 

如何判断循环队列队满?修改队满条件(front=rear),浪费一个元素空间,当队列还有一个空闲空间是就认为队满。

front=(rear+1)%Maxsize


 

入队:

Status EnQueue(SqQueue &Q, QElemType e)
{
    if((Q.rear+1)%Maxsize==Q.front) return ERROR;
    Q.data[Q.rear]=e;
    Q.rear=(Q.rear+1)%MAXQSIZE;
    return OK;
}

出队:

Status DeQueue (LinkQueue &Q, QElemType &e)
{
    if(Q.front==Q.rear) return ERROR;
    e=Q.data[Q.front];
    Q.front=(Q.front+1)%Maxsize;
    return OK;
}

求循环队列的长度:

int QueueLength (SqQueue Q)
{
    return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; 
}

暂时先这样,有时间再更。

 

标签:return,队列,Maxsize,循环,关于,front,rear
来源: https://www.cnblogs.com/marswithme/p/16085222.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有