C语言实现队列

本文详细介绍了如何用C语言实现一个队列,包括队列的定义、初始化、判空/满、入队和出队操作,并提供了测试示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列是一种常用的数据结构,它是一种先进先出(FIFO)的线性表,也就是说,只能在一端(称为队尾)插入元素,而在另一端(称为队头)删除元素。队列的应用场景很多,比如操作系统中的进程调度、网络中的数据包传输、打印机的任务缓冲等等。

本文将介绍如何用 C 语言实现一个简单的队列,并给出相关的代码和测试示例。

队列的定义

要实现一个队列,我们首先需要定义一个队列的结构体,它包含以下几个成员:

  • data:一个数组,用来存储队列中的元素。
  • front:一个整数,表示队头元素的下标。
  • rear:一个整数,表示队尾元素的下标。
  • maxsize:一个整数,表示队列的最大容量。
// 队列的结构体定义
typedef struct Queue {
    int *data; // 队列元素数组
    int front; // 队头下标
    int rear; // 队尾下标
    int maxsize; // 队列最大容量
} Queue;

队列的初始化

要初始化一个队列,我们需要分配一定大小的内存空间给 data 数组,并将 frontrear 都设为 -1,表示队列为空。同时,我们需要传入一个参数 size,表示队列的最大容量,并将其赋值给 maxsize

// 队列的初始化函数
Queue *initQueue(int size) {
    Queue *q = (Queue *)malloc(sizeof(Queue)); // 分配内存空间给队列结构体
    q->data = (int *)malloc(sizeof(int) * size); // 分配内存空间给队列元素数组
    q->front = -1; // 设置队头下标为 -1
    q->rear = -1; // 设置队尾下标为 -1
    q->maxsize = size; // 设置队列最大容量为 size
    return q; // 返回队列指针
}

队列的判空和判满

要判断一个队列是否为空,我们只需要检查 frontrear 是否相等。如果相等,说明队列为空;否则,说明队列不为空。

// 队列的判空函数
int isEmpty(Queue *q) {
    return q->front == q->rear; // 如果队头下标等于队尾下标,返回 1;否则返回 0
}

要判断一个队列是否已满,我们需要考虑两种情况:

  • 如果 rear + 1 == maxsize,说明队尾已经到达数组的最后一个位置,且数组已经被填满。
  • 如果 rear + 1 == front,说明队尾已经绕回到数组的第一个位置,且数组已经被填满。
// 队列的判满函数
int isFull(Queue *q) {
    return (q->rear + 1) % q->maxsize == q->front; // 如果 (队尾下标 + 1) 对最大容量取余等于队头下标,返回 1;否则返回 0
}

队列的入队和出队

要实现一个元素入队,我们需要先判断队列是否已满。如果已满,则无法入队;否则,将元素放入 rear + 1 的位置,并更新 rear 的值。注意,这里我们使用了取余运算符 % 来实现循环数组的效果。

// 队列的入队函数
void enqueue(Queue *q, int x) {
    if (isFull(q)) { // 如果队列已满,打印错误信息并返回
        printf("Queue is full!\n");
        return;
    }
    q->rear = (q->rear + 1) % q->maxsize; // 更新队尾下标
    q->data[q->rear] = x; // 将元素放入队尾位置
}

要实现一个元素出队,我们需要先判断队列是否为空。如果为空,则无法出队;否则,将 front + 1 的位置的元素返回,并更新 front 的值。同样,这里我们使用了取余运算符 % 来实现循环数组的效果。

// 队列的出队函数
int dequeue(Queue *q) {
    if (isEmpty(q)) { // 如果队列为空,打印错误信息并返回 -1
        printf("Queue is empty!\n");
        return -1;
    }
    q->front = (q->front + 1) % q->maxsize; // 更新队头下标
    return q->data[q->front]; // 返回队头位置的元素
}

队列的测试

为了测试我们实现的队列是否正确,我们可以编写一个简单的测试程序,如下:

// 队列的测试程序
int main() {
    Queue *q = initQueue(5); // 初始化一个最大容量为 5 的队列
    enqueue(q, 1); // 入队元素 1
    enqueue(q, 2); // 入队元素 2
    enqueue(q, 3); // 入队元素 3
    printf("%d\n", dequeue(q)); // 出队元素,打印 1
    printf("%d\n", dequeue(q)); // 出队元素,打印 2
    enqueue(q, 4); // 入队元素 4
    enqueue(q, 5); // 入队元素 5
    enqueue(q, 6); // 入队元素 6
    enqueue(q, 7); // 尝试入队元素 7,打印错误信息
    printf("%d\n", dequeue(q)); // 出队元素,打印 3
    printf("%d\n", dequeue(q)); // 出队元素,打印 4
    printf("%d\n", dequeue(q)); // 出队元素,打印 5
    printf("%d\n", dequeue(q)); // 出队元素,打印 6
    printf("%d\n", dequeue(q)); // 尝试出队元素,打印错误信息并返回 -1
    return 0;
}

运行结果如下:

1
2
Queue is full!
3
4
5
6
Queue is empty!
-1

可以看到,我们实现的队列符合预期的功能和逻辑。

本文介绍了如何用 C 语言实现一个简单的队列,并给出了相关的代码和测试示例。希望这篇文章对你有所帮助。如果你有任何问题或建议,欢迎在评论区留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值