1,若希望循环队列中的元素都能得到利用,则需设置一个标志域tag,并以tag的值为0或1来区分队头指针front和队尾指针rear相同时的队列状态是“空”还是“满”。试编写与此结构相应的入队和出队算法。
思路:利用tag来标记队列空或满的条件如下为:
tag等于0时,并且Q.front==Q.rear ,则为队空;tag等于1时,并且Q.front==Q.rear,则为队满。
队列结构
#define MaxSize 10;
typedef struct Queue{
int tag;
int front, rear;
int data[MaxSize];
}Queue;
初始化队列
// 初始化队列
void InitQueue(Queue &Q){
Q.tag = 0;
Q.front = Q.rear = 0;
}
队列判空
// 判空
bool Empty(Queue Q){
if(tag == 0 && Q.front == Q.rear){
return true;
}
return false;
}
队列判满
// 判满
bool Full(Queue Q){
if(tag == 1 && Q.front == Q.rear){
return true;
}
return false;
}
入队
// 入队
bool EnQueue(Queue &Q, int n){
// 判满
if(Full(Q)){
return false;
}
Q.data[Q.rear] = n;
Q.rear = (Q.rear+1)%MaxSize;
// 节点入队后,判断指针是否相等,决定空满标志tag的值
if(Q.rear == Q.front){
Q.tag = 1;
}
return true;
}
出队
bool DeQueue(Queue &Q, int &e){
if(Empty(Q)){
return false;
}
e = Q.data[Q.front];
Q.front = (Q.front+1)%MaxSize;
if(Q.front == Q.rear){
Q.tag = 0;
}
return true;
}