关于 循环队列
这篇博客主要总结一下循环队列的顺序存储方式
#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; }
暂时先这样,有时间再更。