循环队列的基本操作
循环队列主要包括以下操作:
- 初始化(InitQueue): 初始化一个空的循环队列。
- 判空(QueueEmpty): 判断队列是否为空。
- 入队(EnQueue): 将一个元素加入队列的尾部。
- 出队(DeQueue): 将队列头部的元素移除,并返回其值。
- 获取队头元素(GetHead): 获取队列头部的元素值,但不移除该元素。
下面是循环队列的实现代码及其解释。
循环队列的实现
#include <bits/stdc++.h>
using namespace std;
#define MaxSize 10
// 循环队列结构
typedef struct {
int data[MaxSize];
int front, rear;
} SqQueue;
// 初始化队列
void InitQueue(SqQueue &Q) {
Q.front = Q.rear = 0;
}
// 判断队列是否为空
bool QueueEmpty(SqQueue Q) {
return Q.rear == Q.front;
}
// 入队
bool EnQueue(SqQueue &Q, int x) {
if ((Q.rear + 1) % MaxSize == Q.front) // 队列是否已满
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
// 出队
bool DeQueue(SqQueue &Q, int &x) {
if (Q.rear == Q.front) // 队列是否为空
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
// 获取队头元素
bool GetHead(SqQueue Q, int &x) {
if (Q.front == Q.rear) // 队列是否为空
return false;
x = Q.data[Q.front];
return true;
}
int main() {
SqQueue Q;
InitQueue(Q);
// 入队操作
for (int i = 0; i < 5; ++i) {
EnQueue(Q, i + 1);
}
// 获取队头元素
int head;
if (GetHead(Q, head))
printf("队头元素: %d\n", head);
// 出队操作
int x;
while (!QueueEmpty(Q)) {
DeQueue(Q, x);
printf("出队元素: %d\n", x);
}
return 0;
}
代码解释
- 初始化队列
void InitQueue(SqQueue &Q) {
Q.front = Q.rear = 0;
}
该函数将队列的 front
和 rear
指针初始化为 0,表示队列为空。
- 判断队列是否为空
bool QueueEmpty(SqQueue Q) {
return Q.rear == Q.front;
}
该函数检查 rear
是否等于 front
,如果相等,则队列为空,返回 true
。
- 入队
bool EnQueue(SqQueue &Q, int x) {
if ((Q.rear + 1) % MaxSize == Q.front) // 队列是否已满
return false;
Q.data[Q.rear] = x;
Q.rear = (Q.rear + 1) % MaxSize;
return true;
}
该函数首先检查队列是否已满,如果未满,则将 x
加入 rear
所指的位置,并更新 rear
指针。这里使用取模运算来实现循环。
- 出队
bool DeQueue(SqQueue &Q, int &x) {
if (Q.rear == Q.front) // 队列是否为空
return false;
x = Q.data[Q.front];
Q.front = (Q.front + 1) % MaxSize;
return true;
}
该函数首先检查队列是否为空,如果不为空,则将 front
所指的位置的元素移出,并更新 front
指针。这里同样使用取模运算来实现循环。
- 获取队头元素
bool GetHead(SqQueue Q, int &x) {
if (Q.front == Q.rear) // 队列是否为空
return false;
x = Q.data[Q.front];
return true;
}
该函数首先检查队列是否为空,如果不为空,则返回 front
所指位置的元素。
示例操作
在 main
函数中,我们演示了初始化队列、入队、出队和获取队头元素的操作。
int main() {
SqQueue Q;
InitQueue(Q);
// 入队操作
for (int i = 0; i < 5; ++i) {
EnQueue(Q, i + 1);
}
// 获取队头元素
int head;
if (GetHead(Q, head))
printf("队头元素: %d\n", head);
// 出队操作
int x;
while (!QueueEmpty(Q)) {
DeQueue(Q, x);
printf("出队元素: %d\n", x);
}
return 0;
}
通过这些操作,可以看到循环队列的基本功能:初始化、入队、出队和获取队头元素。实际应用中,循环队列常用于解决需要固定大小的队列问题,例如缓冲区管理等。
总结
通过以上代码示例,我们介绍了循环队列的实现方式。循环队列的优点是可以高效地利用数组空间,避免了因数组末尾空间不足而浪费的情况。