题目:假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(EnQueue)和删除(DeQueue)算法。
思路:当tag等于0并且头指针和尾指针指向同一位置时,队空;当tag等于1并且头指针和尾指针指向同一位置时,队满。
队列的结构:
#define MAXSIZE 100;
typedef struct Queue{
Elemtype tage;
Elemtype front,rear;
Elemtype data[MAXSIZE];
}Queue;
队列初始化:
Status InitQueue(Queue &Q){
Q.tag=0;
Q.front=Q.rear=0;
return OK;
}
队列判空:
bool IsEmpty(Queue Q){
if(tag==0&&Q.front==Q.rear){
return true;
}
return false;
}
队列判满:
bool IsFull(Queue Q){
if(tag==1&&Q.front==Q.rear){
return true;
}
return false;
}
入队:
Status EnQueue(Queue &Q,Elemtype n){
if(IsFull(Q)){ //判断队列是否为空
return ERROR;
}
Q.data[Q.rear]=n;
Q.rear=(Q.rear+1)%MAXSIZE;
if(Q.rear==Q.front){ //入队后判断队列是否满
Q.tag=1;
}
return OK;
}
出队:
Status DeQueue(Queue &Q,Elemtype &e){
if(IsEmpty(Q)){ //判断队列是否为空
return ERROR;
}
e=Q.data[Q.front];
Q.front=(Q.front+1)%MAXSIZE;
if(Q.front==Q.rear){ //出队后判断队列是否为空
Q.tag=0;
}
return OK;
}