循环队列的基本操作
时间: 2023-07-04 18:13:29 浏览: 94
队列的基本操作
循环队列是一种经典的线性数据结构,它具有先进先出的特性,在工程实践中得到广泛应用。循环队列的基本操作包括:
1. 初始化队列
```c
int InitSqQueue(SqQueue *Q);
```
该函数用于初始化循环队列,将队头、队尾指针初始化为0,并返回1表示初始化成功。
2. 判断队列是否为空
```c
int IsEmpty(SqQueue Q);
```
该函数用于判断循环队列是否为空,如果队头指针和队尾指针相等,则表示队列为空,返回1;否则返回0。
3. 判断队列是否已满
```c
int IsFull(SqQueue Q);
```
该函数用于判断循环队列是否已满,如果队头指针加1等于队尾指针,则表示队列已满,返回1;否则返回0。
4. 入队
```c
int EnQueue(SqQueue *Q, DataType item);
```
该函数用于将元素item插入到循环队列Q的队尾。如果队列已满,则返回0;否则将元素插入队列中,队尾指针加1,返回1表示插入成功。
5. 出队
```c
int DeQueue(SqQueue *Q, DataType *item);
```
该函数用于将循环队列Q的队头元素出队,并将元素值保存到item中。如果队列为空,则返回0;否则将队头元素出队,队头指针加1,返回1表示出队成功。
下面是循环队列的完整代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int DataType;
#define QUEUESIZE 100 /* 队列的最大长度 */
/* 循环队列的定义 */
typedef struct {
DataType items[QUEUESIZE];
int front, rear; /* 队头、队尾指针 */
} SqQueue;
/* 初始化循环队列 */
int InitSqQueue(SqQueue *Q) {
memset(Q->items, 0, sizeof(Q->items)); // 将队列元素初始化为0
Q->front = Q->rear = 0; // 初始化队头、队尾指针为0
return 1; // 初始化成功,返回1
}
/* 判断队列是否为空 */
int IsEmpty(SqQueue Q) {
return (Q.front == Q.rear); // 如果队头指针和队尾指针相等,则表示队列为空
}
/* 判断队列是否已满 */
int IsFull(SqQueue Q) {
return ((Q.rear + 1) % QUEUESIZE == Q.front); // 如果队头指针加1等于队尾指针,则表示队列已满
}
/* 入队 */
int EnQueue(SqQueue *Q, DataType item) {
if (IsFull(*Q)) { // 如果队列已满,则返回0表示插入失败
return 0;
} else { // 否则将元素插入队列中
Q->items[Q->rear] = item; // 将元素插入队尾
Q->rear = (Q->rear + 1) % QUEUESIZE; // 队尾指针加1
return 1; // 插入成功,返回1
}
}
/* 出队 */
int DeQueue(SqQueue *Q, DataType *item) {
if (IsEmpty(*Q)) { // 如果队列为空,则返回0表示出队失败
return 0;
} else { // 否则将队头元素出队,并将元素值保存到item中
*item = Q->items[Q->front]; // 保存队头元素
Q->front = (Q->front + 1) % QUEUESIZE; // 队头指针加1
return 1; // 出队成功,返回1
}
}
int main() {
SqQueue Q;
int i;
DataType item;
InitSqQueue(&Q); // 初始化队列
for (i = 1; i <= 5; i++) { // 入队5个元素
EnQueue(&Q, i);
}
while (!IsEmpty(Q)) { // 循环出队
DeQueue(&Q, &item);
printf("%d ", item);
}
printf("\n");
return 0;
}
```
阅读全文