在前面队列的顺序存储中,我们遇到了一个问题,就是我们如果要队尾出列一个元素的话,相应的front就要加1,而一旦front和rear都指向队尾后,就会造成,存储空间还有,然而队列已满,无法存储的现象。我们要解决这个问题,用队伍前面的空间继续存储元素,在rear指向队尾前一个元素且队列尚未装满时,加入一个元素后,使其指向队首,这样就实现了循环队列,满足了我们的要求。
为了区分,队满与队空状态的区别,我们把front和rear指向同一个位置定为空,front指向rear下一个位置的状态为满,条件判断为:当rear指向MAX_SIZE-1的位置时为:(rear+1)%MAX_SIZE == front 当rear指向别的位置时是:rear+1 == front 综合起来也可以用(rear+1)%MAX_SIZE == front来表示。基于这个判断队列为满的特性,队列存储的最大元素的数应当为MAX_SIZE - 1.
#define MAX_SIZE 13
typedef int dataType;
typedef struct {
dataType queue[MAX_SIZE];
int front;
int rear;
}CyQueue;
bool init(CyQueue*& CQ) {
if (!CQ) return false;
CQ->front = CQ->rear = 0;
return true;
}
bool isEmpty(CyQueue*& CQ) {
if (!CQ) return false;
if (CQ->front == CQ->rear) return true;
return false;
}
bool isFull(CyQueue*& CQ) {
if (!CQ) return false;
if ((CQ->rear + 1) % MAX_SIZE == CQ->front) return true;
return false;
}
bool CQinsert(CyQueue*& CQ,dataType data) {
if (!CQ) return false;
if (isFull(CQ)) {
cout << "循环队列已满!" << endl;
return false;
}
CQ->queue[CQ->rear] = data;
CQ->rear = (CQ->rear + 1) % MAX_SIZE;
return true;
}
bool CQdelete(CyQueue*& CQ) {
if (!CQ) return false;
if (isEmpty(CQ)) {
cout << "循环队列已空!不能在元素出队啦!" << endl;
return false;
}
CQ->front = (CQ->front + 1) % MAX_SIZE;
return true;
}
bool printCQ(CyQueue*& CQ) {
if (!CQ) return false;
if (isEmpty(CQ)) {
cout << "这个队列是空的!" << endl;
return false;
}
int p = CQ->front;
while(p!=CQ->rear){
cout << CQ->queue[p] << endl;
p = (p + 1) % MAX_SIZE;
}
return true;
}
原文:https://www.cnblogs.com/Ybossy/p/12874180.html