首页 > 其他 > 详细

循环队列

时间:2020-05-12 10:35:27      阅读:80      评论:0      收藏:0      [点我收藏+]

循环队列

导入及其原理

在前面队列的顺序存储中,我们遇到了一个问题,就是我们如果要队尾出列一个元素的话,相应的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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!