循环队列

循环队列

导入及其原理

在前面队列的顺序存储中,我们遇到了一个问题,就是我们如果要队尾出列一个元素的话,相应的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;
}
posted @ 2020-05-12 09:16  YBossy  阅读(290)  评论(0)    收藏  举报