队列:
只允许在一端进行插入操作,另一端进行删除操作的线性表
循环队列:
队列的头尾相接的顺序存储结构称为循环队列
front指向第一个元素,rear指向最后一个元素的下一个位置
队空front==rear
队空和队满的时候条件是一样的,我们有两种解决办法,首先是设置一个标识位,用来区别队空和队满的。其次是少用一个单元,即当只有一个单元的时候,我们就认为队满了。我们使用下一种方法,即牺牲一个单元格。
队满:因为有以下两种情况,rear大于front和rear小于front,所以我们不能简单的使用rear+1==front来判断了,必须使用(rear+1)%QueueSize == front
队长:同上,也是有两种情况,一种是rear大于front时(rear-front),另一种为rear小于front,(QueueSize-front+rear),所以通用的公式为(QueueSize-front+rear)%QueueSize
- #define MAXSIZE 40
- typedef int ElemType;
- typedef struct SqQueue{
- ElemType data[MAXSIZE];
- int front;
- int rear;
- }SqQueue,*pSqQueue
- void initQueue(pSqQueuue pQ){
- Q->front = 0;
- Q->rear = 0;
- }
- int QueueLength(SqQueue Q){
- return (Q.rear+MAXSIZE-Q.front)%MAXSIZE;//求队长
- }
- bool EnQueue(pSqQueue pQ,ElemType e){
- if((pQ->rear+1)%MAXSIZE)==pQ->front){//判断队满
- return false;
- }
- pQ->data[pQ->rear] = e;
- pQ->rear = (pQ->rear+1)%MAXSIZE;//尾指针移位
- return true;
- }
- bool DeQueue(pSqQueue pQ,ElemType *e){
- if((pQ->rear) == (pQ->front)){//判断队空
- return false;
- }
- *e = pQ->data[pQ->front];
- pQ->front = (pQ->front+1)%MAXSIZE;//头指针移位
- return true;
- }