队列的学习(二)-顺序队列(循环队列)

1.顺序存储的队列的定义
物理存储空间为一片连续的内存空间。

#define MaxSize 10
//顺序队列的定义
typedef struct SqQuene 
{
	int data[MaxSize];
	int front, rear;//队头队尾指针;队尾指针指向接下来要插入数据元素的位置。
};

2. 顺序队列的初始化

//顺序队列的初始化
void InitQuene(SqQuene &Q)
{
//rear指针指向队尾元素后一个位置,front指针指向队头元素
	Q.front = Q.rear = 0;
}

3. 判断是否为空队列

//判断是否为空队列
bool QueneEmpty(SqQuene Q)
{
	if (Q.front == Q.rear)
		return true;
	else
		return false;
}

4. 判断是否为满队列

//判断是否为满队列
bool QueneFull(SqQuene Q)
{
	if ((Q.rear + 1) % MaxSize == Q.front)
		return true;
	else
		return false;
}

5. 顺序队列的入队

//顺序队列的入队
bool EnQuene(SqQuene &Q, int x)
{
	//if (Q.rear == MaxSize)//注意队列不能只根据队尾判断队列满了,而是要根据队头和队尾共同判断队列是否满了
	//	return false;
	//因此需要通过队尾和队头共同判断队列是否满了,特别是对于循环队列。
	if ((Q.rear + 1) % MaxSize == Q.front)
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1) % MaxSize;

	return true;
}

6. 顺序队列的出队

//顺序队列(循环队列)的出队
bool Dequene(SqQuene &Q, int &x)
{
	if (Q.front == Q.rear)
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;//为了保证front指针和rear指针转圈圈移动
	return true;
}

7.获得队头元素

//获得队头元素
bool GetHead(SqQuene &Q, int &x)
{
	if (Q.front == Q.rear)
		return false;
	x = Q.data[Q.front];
	return true;
}

8. 求解队列元素个数

//求解队列元素个数
bool GetEle(SqQuene &Q, int &x)
{
	if (Q.front == Q.rear)
		return false;
	//Q.rear-Q.front+MaxSize是为了防止Q.front循环到Q.rear之后
	x = (Q.rear + MaxSize - Q.front) % MaxSize;
	return true;
}

9. 添加辅助变量来区分队列满和队列空
上述要求Q.rear与Q.front之间存在一个不可存放的内存区域;如果不希望存在这个区域的话,可以通过添加辅助变量,例如size记录队列的长度,tag记录队列最近的一步是入队还是出队操作,从而判断队列是满的还是空的。

上一篇:【数据结构·考研】循环双端队列


下一篇:数据结构/PTA-在一个数组中实现两个堆栈/函数