方案一:牺牲一个单元来区分队空和队满,入队时少用一个队列单元,这是一种普遍的做法
队满条件:队尾指针的再下一个位置是队头,即 (Q.rear+1)%MaxSize==Q.front,
队空条件:Q.rear==Q.front
//构造循环队列
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
}SqQueue;
//初始化循环队列
void InitSqQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
}
//判断循环队列是否为空
bool EmptyQueue(SqQueue Q)
{
if (Q.front == Q.rear) return true;
else return false;
}
//入队操作
bool EnQueue(SqQueue &Q, ElemType x)
{
//判断队列是否已满
if ((Q.rear+1)%MaxSize == Q.front) return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)%MaxSize;
return true;
}
//出队操作
bool DeQueue(SqQueue &Q,ElemType &x)
{
//判断队列是否为空
if (Q.front == Q.rear) return false;
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
return true;
}
方案二:增设元素个数的数据成员size, 插入成功size++;删除成功 size--;
队满条件: size==MaxSize
队空条件:size == 0
//构造循环队列
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
int size;
}SqQueue;
//初始化循环队列
void InitSqQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
size == 0;
}
//判断循环队列是否为空
bool EmptyQueue(SqQueue Q)
{
if (size == 0) return true;
else return false;
}
//入队操作
bool EnQueue(SqQueue &Q, ElemType x)
{
//判断队列是否已满
if (size==MaxSize ) return false;
Q.data[Q.rear] = x;
size++;
return true;
}
//出队操作
bool DeQueue(SqQueue &Q,ElemType &x)
{
//判断队列是否为空
if (Q.front == Q.rear) return false;
x = Q.data[Q.front];
size--;
return true;
}
方案三:增设tag数据成员,每次删除操作成功时,都令tag=0;每次插入操作成功时,都令tag=1;
只有删除操作,才可能导致队空只有插入操作,才可能导致队满
队满条件: front==rear && tag ==1
队空条件:front==rear && tag ==0
//构造循环队列
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
int tag;
}SqQueue;
//初始化循环队列
void InitSqQueue(SqQueue &Q)
{
Q.front = Q.rear = 0;
tag == 0;
}
//判断循环队列是否为空
bool EmptyQueue(SqQueue Q)
{
if (Q.front == Q.rear && Q.tag == 0) return true;
else return false;
}
//入队操作
bool EnQueue(SqQueue &Q, ElemType x)
{
//判断队列是否已满
if (Q.front == Q.rear && Q.tag == 1 ) return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear+1)%MaxSize;
Q.tag=1;
return true;
}
//出队操作
bool DeQueue(SqQueue &Q,ElemType &x)
{
//判断队列是否为空
if (Q.front == Q.rear && Q.tag == 0) return false;
x = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
Q.tag=0;
return true;
}