【c语言】队列

目录

队列简介

队列的实现

注意事项:


队列简介

队列(Queue)是一种数据结构,它遵循先进先出(FIFO)的原则。队列在计算机科学中有着广泛的应用,如操作系统、编译器、图形学等领域。

C语言中队列可以使用数组或链表来实现。队列通常有两个指针,一个指向队头,一个指向队尾。入队操作将元素插入队尾,出队操作将队头元素移出队列。队列中还包含一些基本操作,如获取队列长度、判断队列是否为空、获取队头元素等。

在C语言中,使用结构体来表示队列和队列中的节点。具体实现可以参考上面的代码示例。使用队列可以很好地解决某些问题,如在多线程环境下处理任务、在操作系统中管理进程等。

队列的实现

#include <stdio.h>
#include <stdlib.h>

// 节点结构体
struct Node {
    int data;
    struct Node* next;
};

// 队列结构体
struct Queue {
    struct Node* head; // 队列头指针
    struct Node* tail; // 队列尾指针
};

// 创建节点
struct Node* createNode(int data) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

// 创建队列
struct Queue* createQueue() {
    struct Queue* queue = (struct Queue*)malloc(sizeof(struct Queue));
    queue->head = queue->tail = NULL;
    return queue;
}

// 判断队列是否为空
int isEmpty(struct Queue* queue) {
    return queue->head == NULL;
}

// 入队操作
void enqueue(struct Queue* queue, int data) {
    struct Node* newNode = createNode(data);
    if (isEmpty(queue)) {
        queue->head = queue->tail = newNode;
        return;
    }
    queue->tail->next = newNode;
    queue->tail = newNode;
}

// 出队操作
int dequeue(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("队列为空,无法出队\n");
        return -1;
    }
    int data = queue->head->data;
    struct Node* temp = queue->head;
    queue->head = queue->head->next;
    free(temp);
    return data;
}

// 获取队头元素
int front(struct Queue* queue) {
    if (isEmpty(queue)) {
        printf("队列为空,无法获取队头元素\n");
        return -1;
    }
    return queue->head->data;
}

// 获取队列长度
int size(struct Queue* queue) {
    int count = 0;
    struct Node* current = queue->head;
    while (current != NULL) {
        count++;
        current = current->next;
    }
    return count;
}

// 主函数,测试代码
int main() {
    struct Queue* queue = createQueue();
    enqueue(queue, 1); // 入队
    enqueue(queue, 2); // 入队
    enqueue(queue, 3); // 入队
    printf("%d\n", front(queue)); // 获取队头元素
    printf("%d\n", dequeue(queue)); // 出队
    printf("%d\n", dequeue(queue)); // 出队
    printf("%d\n", dequeue(queue)); // 出队
    printf("%d\n", dequeue(queue)); // 出队,此时队列已为空,无法再出队
    return 0;
}

这段代码实现了一个基本的队列,包括队列的创建、入队、出队、获取队头元素、判断队列是否为空以及获取队列长度等操作。

createNode(int data)函数:

这段代码定义了一个名为createNode的函数,用于创建一个新的节点。它接受一个整型数据data作为参数,表示节点的值。函数内部首先通过malloc函数分配了一块内存,用于存储新节点。然后将该节点的data域赋值为传入的参数data,并将next域初始化为NULL。最后,将新节点的指针返回给调用者。在这里,使用了结构体指针(struct Node*)来指向新创建的节点,因为需要在其他函数中访问和修改这个节点的内容。

createQueue()函数:

这段代码定义了一个名为createQueue()的函数,其返回值类型为指向struct Queue类型的指针。在函数内部,它使用malloc()函数动态地分配了一个struct Queue类型的内存空间,并将分配的内存空间地址赋给指针queue。然后,它将queue的head和tail指针都初始化为NULL,表示队列为空。最后,函数返回了指向queue的指针。这个函数实现了创建一个空队列的功能。

isEmpty(struct Queue* queue)函数:

这是一个用于判断队列是否为空的函数。在这个函数中,它检查队列的头指针是否为空。如果头指针为空,则该队列为空,返回值为1,否则返回值为0,表示队列不为空。

enqueue(struct Queue* queue, int data)函数:

该函数实现队列的入队操作,将一个整型数据 data 插入到 queue 队列的队尾。首先通过 createNode(data) 函数创建一个新节点 newNode,其中节点的数据域为 data,next指针为 NULL。如果队列 queue 为空,即头指针 head 为空,则将队头和队尾都指向新节点 newNode。这时队列只有一个节点,也就是刚刚插入的新节点。如果队列不为空,则将当前队尾节点的 next 指针指向新节点 newNode,然后将队尾指针 tail 指向新节点,这样新节点就成为了队列的新的尾节点。函数结束,新节点 newNode 已经成功入队。

dequeue(struct Queue* queue)函数:

这段代码实现了队列的出队操作,函数的参数是一个指向队列的指针。如果队列为空,函数会打印一条错误信息并返回-1表示出队失败。否则,函数会获取队头元素的值,然后将队头指针指向下一个节点,释放原来的队头节点,并返回获取到的值。具体实现中,首先使用isEmpty()函数判断队列是否为空。如果是空队列,则打印错误信息并返回-1。否则,从队头节点获取元素的值,并将队头指针指向下一个节点。接着,释放原来的队头节点,返回获取到的值。这样就完成了队列的出队操作。

front(struct Queue* queue)函数:

这是获取队列头部元素的函数。首先判断队列是否为空,如果是,输出一条错误信息并返回-1。如果不是,返回队头元素的值。

size(struct Queue* queue)函数:

这段代码实现了获取队列的长度。在函数中定义了一个整型变量 count 并初始化为 0,用来记录队列的节点个数。然后定义了一个指向节点的指针变量 current,初始化为队列的头节点。通过一个循环,不断遍历队列中的每个节点,每遍历一个节点,就将 count 增加 1,然后将 current 指向下一个节点,直到遍历完整个队列。最后返回 count,即队列的长度。

注意事项:

我们学习队列时要注意理解队列的基本概念和特点,队列是一种先进先出(FIFO)的数据结构,其中新元素只能在队列的末尾添加,而旧元素只能从队列的头部删除。还要熟悉队列的基本操作,队列的基本操作包括入队(enqueue)、出队(dequeue)、获取队头元素(front)、判断队列是否为空(isEmpty)和获取队列长度(size)等。还要理解队列的应用场景,队列的应用场景包括计算机系统中的任务调度、网络中的数据传输、广度优先搜索算法、模拟系统等。以及注意队列的数据类型和内存管理,队列通常是由链表或数组实现的,需要注意节点或元素的数据类型和内存分配、释放等问题。还要了解队列的变种结构和算法,队列有多种变种结构和算法,例如双端队列、优先队列、循环队列、阻塞队列、并发队列、队列排序等,需要根据实际需求选择合适的结构和算法。还要注意练习队列的基本操作和应用,可以通过编写代码和解决问题的方式来练习队列的基本操作和应用,例如实现任务调度、搜索算法、数据传输等功能,同时也可以查阅相关的算法书籍和在线资源来学习和掌握更多的知识。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值