首页 > 后端开发 > C++ > 正文

C语言中的队列是什么?

WBOY
发布: 2024-07-11 15:25:47
转载
1535人浏览过

c语言中的队列是什么?

c 中的队列是遵循先进先出(fifo)原则的基本数据结构。这意味着添加到队列中的第一个元素将是第一个被删除的元素。队列在计算机科学中广泛用于各种应用,例如任务调度、图中的广度优先搜索和缓冲数据流。

定义及基本操作

队列通常支持以下主要操作:

1.排队:

将一个元素添加到队列末尾。

立即学习C语言免费学习笔记(深入)”;

2.出队:

从队列前面删除一个元素。

3.偷看/正面:

检索但不删除队列的前面元素。

4.为空:

检查队列是否为空。

5.已满:

检查队列是否已满(适用于固定大小队列实现)。

队列的类型

有多种类型的队列,每种类型适合不同的用例:

1.线性队列:

最基本的形式,元素在后面添加,前面删除。

2.循环队列:

线性队列的更高效版本,其中最后一个位置连接回第一个位置以形成一个循环。这有助于更有效地利用存储。

3.优先队列:

元素添加时具有优先级,并根据优先级而不是到达顺序出列。

4.双端队列(deque):

允许从两端插入和删除元素。

c中队列的实现

队列可以使用数组或链表在 c 中实现。以下是基本实现:

基于数组的实现

这种方法使用固定大小的数组来存储元素。这是一个简单的实现:

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

#define max 100

typedef struct {
    int data[max];
    int front;
    int rear;
} queue;

void initializequeue(queue *q) {
    q->front = -1;
    q->rear = -1;
}

int isfull(queue *q) {
    return q->rear == max - 1;
}

int isempty(queue *q) {
    return q->front == -1 || q->front > q->rear;
}

void enqueue(queue *q, int value) {
    if (isfull(q)) {
        printf("queue is full\n");
        return;
    }
    if (q->front == -1) q->front = 0;
    q->data[++q->rear] = value;
}

int dequeue(queue *q) {
    if (isempty(q)) {
        printf("queue is empty\n");
        return -1;
    }
    return q->data[q->front++];
}

int peek(queue *q) {
    if (isempty(q)) {
        printf("queue is empty\n");
        return -1;
    }
    return q->data[q->front];
}

int main() {
    queue q;
    initializequeue(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);

    printf("front element is %d\n", peek(&q));

    printf("removed %d\n", dequeue(&q));
    printf("front element is %d\n", peek(&q));

    return 0;
}

登录后复制

基于链表的实现

这种方法使用在内存中动态分配的节点。这是一个实现:

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

typedef struct Node {
    int data;
    struct Node *next;
} Node;

typedef struct {
    Node *front;
    Node *rear;
} Queue;

void initializeQueue(Queue *q) {
    q->front = NULL;
    q->rear = NULL;
}

int isEmpty(Queue *q) {
    return q->front == NULL;
}

void enqueue(Queue *q, int value) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;
    if (q->rear == NULL) {
        q->front = q->rear = newNode;
        return;
    }
    q->rear->next = newNode;
    q->rear = newNode;
}

int dequeue(Queue *q) {
    if (isEmpty(q)) {
        printf("Queue is empty\n");
        return -1;
    }
    Node *temp = q->front;
    int data = temp->data;
    q->front = q->front->next;
    if (q->front == NULL) q->rear = NULL;
    free(temp);
    return data;
}

int peek(Queue *q) {
    if (isEmpty(q)) {
        printf("Queue is empty\n");
        return -1;
    }
    return q->front->data;
}

int main() {
    Queue q;
    initializeQueue(&q);

    enqueue(&q, 10);
    enqueue(&q, 20);
    enqueue(&q, 30);

    printf("Front element is %d\n", peek(&q));

    printf("Removed %d\n", dequeue(&q));
    printf("Front element is %d\n", peek(&q));

    return 0;
}
登录后复制

的优点和缺点

优点:

  • 订单:
    在处理元素时保持元素的顺序。

  • 公平性:
    确保每个元素按照添加的顺序进行处理。

  • 简单:
    易于实施和理解。

缺点:

  • 固定大小(基于数组):
    需要预定义大小,这可能会导致空间使用效率低下或溢出。

  • 内存管理(基于链表):
    动态分配需要仔细的内存管理以避免泄漏。

应用领域

队列用于各种场景,例如:

1.任务安排:
在操作系统中,c 中的队列用于管理 cpu 中的任务。
数据流:缓冲数据以不同速率到达的数据流。

2.广度优先搜索:
在图算法中,队列有助于遍历级别。

总之,队列是 c 编程中至关重要的数据结构,提供了一种以结构化且高效的方式管理数据的方法。了解它们的实现和应用对于有效解决软件开发中的问题至关重要。

以上就是C语言中的队列是什么?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:dev.to网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号