循环队列
定义
把队列中,头尾相接的顺序存储结构成为循环队列。
循环队列存在的问题:当空队列时,front 等于 rear;当队列满时,front 等于 rear,那么如何才能判断队列是满还是空?
解决:
- 当队列空时,条件就是front=rear;
- 当队列满时,保留一个元素空间。即当队列满时,数组中还有一个空闲单元。
假设队列的最大尺寸为QueueSize,那么队列满的条件就是:(rear+1)%QueueSize == front;
队列的长度计算公式:(rear-front+QueueSize)%QueueSize,当rear>front时,队列长度为QueueSize= rear-front;当rear<front时,QueueSize= (QueueSize-front)+(rear);
简单实现
#include <stdio.h>
#include <stdbool.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int QElemType;
/* 循环队列的顺序存储结构 */
struct SqQueue{
QElemType data[MAXSIZE];
int front; //头指针
int rear; //尾指针,指向队尾元素的下一个位置
};
/* 初始化一个空队列Q */
Status InitQueue(SqQueue* Q){
Q->front = 0;
Q->rear = 0;
return OK;
}
/* 队列长度 */
int QueueLength(SqQueue* Q){
return (Q->rear+MAXSIZE-Q->front)%MAXSIZE;
}
/* 判断队列是否满 */
bool FullQueue(SqQueue* Q){
if((Q->rear+1)%MAXSIZE == Q->front) //判断是否队满
return true;
return false;
}
/* 判断队列是否空 */
bool EmptyQueue(SqQueue* Q){
if(Q->front == Q->rear)
return true;
return false;
}
/* 若队列未满,则插入元素e为Q的队尾元素 */
Status