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 来存储队列元素。

  • 使用两个指针 frontrear 分别指向队首和队尾。

  • 使用 size 来记录当前队列的大小。

初始化队列 initQueue

  • 将队首和队尾指针初始化为 0,队列大小初始化为 0。

判断队列是否为空 isEmpty

  • 如果队列大小为 0,返回 1(真),否则返回 0(假)。

判断队列是否已满 isFull

  • 如果队列大小等于最大容量,返回 1(真),否则返回 0(假)。

入队操作 enqueue

  • 如果队列已满,打印错误信息并返回。

  • 将新元素放到队尾,队尾指针后移(使用取模操作实现循环队列)。

  • 队列大小加 1。

出队操作 dequeue

  • 如果队列为空,打印错误信息并返回。

  • 队首指针后移(使用取模操作实现循环队列)。

  • 队列大小减 1。

查看队首元素 peek

  • 如果队列为空,打印错误信息并返回错误标志。

  • 返回队首元素。

打印队列 printQueue

  • 遍历队列,打印所有元素。

示例运行

输入:

无输入

输出:

队首元素:10
队列内容:10 20 30 
队首元素:20
队列内容:20 30 

队列的特点

  1. 先进先出(FIFO):元素按照入队的顺序出队。
  2. 循环队列:使用取模操作实现循环队列,提高空间利用率。
  3. 效率:入队和出队操作的时间复杂度为 O(1)。
  4. 适用性:队列适用于需要按顺序处理元素的场景,如任务调度、缓冲区管理等。

通过使用指针和数组实现队列,可以高效地管理队列中的元素,满足先进先出的特性。

视频讲解

BiliBili: 视睿网络-哔哩哔哩视频 (bilibili.com)