053. 使用指针和数组实现队列
在C语言中,队列是一种先进先出(FIFO)的数据结构。使用指针和数组实现队列是一种常见的方法。队列的基本操作包括入队(enqueue
)、出队(dequeue
)、查看队首元素(peek
)以及判断队列是否为空(isEmpty
)。
C语言实现队列
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 队列的最大容量
// 定义队列结构
typedef struct {
int data[MAX_SIZE]; // 存储队列元素的数组
int front; // 队首指针
int rear; // 队尾指针
int size; // 当前队列的大小
} Queue;
// 初始化队列
void initQueue(Queue* q) {
q->front = 0;
q->rear = 0;
q->size = 0;
}
// 判断队列是否为空
int isEmpty(Queue* q) {
return q->size == 0;
}
// 判断队列是否已满
int isFull(Queue* q) {
return q->size == MAX_SIZE;
}
// 入队操作
void enqueue(Queue* q, int value) {
if (isFull(q)) {
printf("队列已满,无法入队!\n");
return;
}
q->data[q->rear] = value; // 将新元素放到队尾
q->rear = (q->rear + 1) % MAX_SIZE; // 队尾指针后移
q->size++; // 队列大小加1
}
// 出队操作
void dequeue(Queue* q) {
if (isEmpty(q)) {
printf("队列为空,无法出队!\n");
return;
}
q->front = (q->front + 1) % MAX_SIZE; // 队首指针后移
q->size--; // 队列大小减1
}
// 查看队首元素
int peek(Queue* q) {
if (isEmpty(q)) {
printf("队列为空,无法查看队首元素!\n");
return -1; // 返回一个错误标志
}
return q->data[q->front]; // 返回队首元素
}
// 打印队列
void printQueue(Queue* q) {
if (isEmpty(q)) {
printf("队列为空!\n");
return;
}
printf("队列内容:");
for (int i = 0; i < q->size; i++) {
int index = (q->front + i) % MAX_SIZE;
printf("%d ", q->data[index]);
}
printf("\n");
}
int main() {
Queue q;
initQueue(&q); // 初始化队列
enqueue(&q, 10);
enqueue(&q, 20);
enqueue(&q, 30);
printf("队首元素:%d\n", peek(&q)); // 查看队首元素
printQueue(&q); // 打印队列
dequeue(&q); // 出队
printf("队首元素:%d\n", peek(&q)); // 查看队首元素
printQueue(&q); // 打印队列
return 0;
}
代码说明
队列结构 Queue
:
-
使用一个固定大小的数组
data
来存储队列元素。 -
使用两个指针
front
和rear
分别指向队首和队尾。 -
使用
size
来记录当前队列的大小。
初始化队列 initQueue
:
- 将队首和队尾指针初始化为 0,队列大小初始化为 0。
判断队列是否为空 isEmpty
:
- 如果队列大小为 0,返回 1(真),否则返回 0(假)。
判断队列是否已满 isFull
:
- 如果队列大小等于最大容量,返回 1(真),否则返回 0(假)。
入队操作 enqueue
:
-
如果队列已满,打印错误信息并返回。
-
将新元素放到队尾,队尾指针后移(使用取模操作实现循环队列)。
-
队列大小加 1。
出队操作 dequeue
:
-
如果队列为空,打印错误信息并返回。
-
队首指针后移(使用取模操作实现循环队列)。
-
队列大小减 1。
查看队首元素 peek
:
-
如果队列为空,打印错误信息并返回错误标志。
-
返回队首元素。
打印队列 printQueue
:
- 遍历队列,打印所有元素。
示例运行
输入:
无输入
输出:
队首元素:10
队列内容:10 20 30
队首元素:20
队列内容:20 30
队列的特点
- 先进先出(FIFO):元素按照入队的顺序出队。
- 循环队列:使用取模操作实现循环队列,提高空间利用率。
- 效率:入队和出队操作的时间复杂度为 O(1)。
- 适用性:队列适用于需要按顺序处理元素的场景,如任务调度、缓冲区管理等。
通过使用指针和数组实现队列,可以高效地管理队列中的元素,满足先进先出的特性。
视频讲解
BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)