C语言 队列的实现全解析

C语言 队列的实现全解析

什么是队列

队列是一种常见的数据结构,它采用先进先出的方式来管理数据。当我们需要按照时间顺序依次处理一系列任务时,队列便成了一个非常有用的工具。

队列的实现

在C语言中,队列可以通过数组或者链表来实现。当使用数组实现队列时,我们需要定义一个固定大小的数组和两个指针——队头指针head和队尾指针tail。定义如下:

#define QUEUE_SIZE 100

typedef struct {
    int data[QUEUE_SIZE];
    int head, tail;
} Queue;

其中,head指向队列的第一个元素,tail指向队尾元素的下一个位置。初始化队列时,将head和tail均初始化为0即可:

Queue q;
q.head = q.tail = 0; // 初始化队列

队列的操作

接下来我们需要实现队列的四个基本操作——入队、出队、查看队首元素和查看队列大小。

入队

入队操作用来将新的元素添加到队列末尾。如果队列已满,入队操作将无法执行。

int enqueue(Queue *q, int element) {
    if ((q->tail + 1) % QUEUE_SIZE == q->head) {
        return 0; // 队列已满,无法入队
    }
    q->data[q->tail] = element;
    q->tail = (q->tail + 1) % QUEUE_SIZE;
    return 1; // 入队成功
}

如果队列已满,tail指针将指向队列的头部,所以我们使用(q->tail + 1) % QUEUE_SIZE来计算新的tail的位置。

出队

出队操作用来将队列中的第一个元素移除并返回它的值。如果队列为空,出队操作将无法执行。

int dequeue(Queue *q) {
    if (q->head == q->tail) {
        return -1; // 队列为空,无法出队
    }
    int res = q->data[q->head];
    q->head = (q->head + 1) % QUEUE_SIZE;
    return res;
}

查看队首元素

查看队首元素操作用来返回队列中的第一个元素,但不会将其移除。如果队列为空,查看队首元素的操作将返回-1。

int peek(Queue *q) {
    if (q->head == q->tail) {
        return -1; // 队列为空,无队首元素
    }
    return q->data[q->head];
}

查看队列大小

查看队列大小操作用来返回队列中元素的个数。

int size(Queue *q) {
    return (q->tail - q->head + QUEUE_SIZE) % QUEUE_SIZE;
}

示例说明

下面给出两个队列的示例操作。

示例一

假设我们要实现一个循环队列,当队列满时,新来的元素将覆盖队列中原有的元素。

#include <stdio.h>

int main() {
    Queue q;
    q.head = q.tail = 0; // 初始化队列
    int n = 5; // 队列的大小为5
    int i;
    for (i = 0; i < n + 1; i++) {
        enqueue(&q, i);
        printf("enqueue %d\n", i);
    }
    printf("队列的元素个数为 %d\n", size(&q)); // 队列的元素个数为 5
    for (i = 0; i < n; i++) {
        int x = dequeue(&q);
        printf("dequeue %d\n", x);
    }
    printf("队列的元素个数为 %d\n", size(&q)); // 队列的元素个数为 0
    return 0;
}

输出:

enqueue 0
enqueue 1
enqueue 2
enqueue 3
enqueue 4
队列已满,无法入队
队列的元素个数为 5
dequeue 0
dequeue 1
dequeue 2
dequeue 3
dequeue 4
队列的元素个数为 0

示例二

假设我们要通过队列实现一个简单的计算器,读入一系列整数和加减号,并按照之前整数的顺序依次进行加减运算,最后输出结果。

#include <stdio.h>

int main() {
    Queue q;
    q.head = q.tail = 0; // 初始化队列
    int n, res = 0, sign = 1; // sign表示当前数字的符号
    char ch;
    scanf("%d", &n);
    enqueue(&q, n); // 将第一个数字入队
    while ((ch = getchar()) != '\n') { 
        if (ch >= '0' && ch <= '9') {
            n = n * 10 + ch - '0';
        } else {
            res += sign * dequeue(&q); // 将队首元素弹出并加到res中
            enqueue(&q, sign * n); // 将新的数字入队
            sign = (ch == '+') ? 1 : -1; // 根据运算符更新符号
            n = 0; // 清除n,准备读入下一个数字
        }
    }
    res += sign * dequeue(&q); // 将队首元素弹出并加到res中
    printf("计算结果为 %d\n", res);
    return 0;
}

假设输入如下:

10 + 1 - 4 + 3

输出:

计算结果为 10

总结

在本文中,我们通过C语言的数组实现和结构体定义,讲解了队列的操作和实现方式,同时提供了两个队列的例子。作为一种常见的数据结构,队列在程序设计中有着广泛的应用,如线程池、事件处理等,自行练习写队列程序有助于更好地掌握C语言的数据结构和算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 队列的实现全解析 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++ auto类型说明符

    C++自动类型说明符(auto)是一种C++11引入的新特性,可以让编译器自动推导出变量的数据类型。使用auto关键字可以帮助简化代码,减少代码冗余,提升阅读性和代码的可维护性。 auto类型说明符的使用方法 在C++11中,使用auto类型说明符定义变量时,可以这样写: auto 变量名 = 初始化表达式; 其中,变量名可以是任意合法的变量名,而初始化表达…

    C 2023年5月23日
    00
  • VS Code 中安装运行、编写C语言程序的详细教程

    以下是在 VS Code 中安装运行、编写 C 语言程序的详细教程: 1. 安装 VS Code 首先,你需要在官网 https://code.visualstudio.com/上下载并安装 VS Code。 2. 安装 C/C++ 扩展 打开 VS Code,并按下快捷键 Ctrl + Shift + X 或者点击左侧的 Extensions 图标 在搜索…

    C 2023年5月23日
    00
  • C++全密码生成的实现代码

    为了实现C++全密码生成,需要了解一些基本的密码学概念以及相应算法,比如哈希函数、加密算法等。以下是一些实现C++全密码生成的步骤和示例代码。 步骤一:选择密码学算法 选择一种可靠的密码学算法非常必要。常见的算法包括DES、AES、RSA、MD5等。根据不同的应用场景选择合适的算法。 以MD5算法为例,它可以将任意长度信息压缩为一个128位长度的信息摘要。下…

    C 2023年5月24日
    00
  • 天天飞车C级赛车威酷属性解析 天天飞车威酷怎么样

    天天飞车C级赛车威酷属性解析 背景介绍 天天飞车是一款流行的赛车竞速游戏,近年来越来越受欢迎。C级赛车威酷作为其中的一种赛车,有着很好的属性表现。本文将详细讲解C级赛车威酷的属性和使用技巧,帮助玩家更好地体验游戏。 属性解析 速度 C级赛车威酷的速度属性为50,算不上顶尖,但也不差。玩家在使用该车时应该注重提高赛车的加速度,以把车开到最高速度。 操控 C级赛…

    C 2023年5月23日
    00
  • 一文弄懂MYSQL如何列转行

    一文弄懂MYSQL如何列转行 背景 在数据库中,有时候需要将列转换成行来展示数据。例如一个表中有多个日期字段,需要将每个日期字段的值作为新的行的一列来展示数据。 原理 MYSQL中提供了UNION ALL语句来实现列转行的功能。该语句可以将多个SELECT语句的结果合并成一个结果集。通过多个SELECT语句中的UNION ALL,可以将多行数据合并成一行,达…

    C 2023年5月22日
    00
  • 软件测试面试题(小结)

    那么来详细讲解一下“软件测试面试题(小结)”的完整攻略。 简述 本文主要是对软件测试面试题(小结)的内容进行详细的讲解和讨论。软件测试作为软件开发流程中的一个重要环节,在面试过程中也是经常被问到的一个话题。在本文中,我们将从面试的准备、常见的面试题、回答技巧等几个方面展开讨论。 面试准备 在进行软件测试的面试之前,应该先认真准备。以下几个方面是需要注意的: …

    C 2023年5月22日
    00
  • CMakeList中自动编译protobuf文件过程

    当使用Protobuf数据交换格式时,我们需要将.proto文件编译为相应的C++类才能在代码中使用它们。CMake是常用的构建工具之一,它具有内置的支持来自动生成Protobuf源代码。 以下是在CMakeList中自动编译protobuf文件的完整攻略: 步骤 1:从Google官网下载Protobuf 要在CMakeList中自动编译protobuf文…

    C 2023年5月23日
    00
  • C语言链表实现商品库存管理系统

    C语言链表实现商品库存管理系统 简介 链表是一种常见的数据结构,优点是可以在任意位置插入或删除元素,而不影响链表中其他元素。因此,链表在一些需要频繁插入或删除元素的场景中非常适用,比如实现商品库存管理系统。 本文将使用C语言来实现链表,并借此来实现一个简单的商品库存管理系统。在该系统中,我们可以添加商品(包括名称、价格和数量),查看商品,删除商品,以及修改商…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部