C语言实现顺序循环队列实例

C语言实现顺序循环队列实例

什么是顺序循环队列?

在计算机科学中,队列(Queue)是一个数据结构,用于存储按顺序排列的元素,具有FIFO(First In First Out)的特点。顺序循环队列是一种基于数组实现的队列,在队列尾部加入元素,在队列头部删除元素。

顺序循环队列的实现

数据结构定义

顺序循环队列的核心是数据结构的定义,它包含以下信息:

  • 队列最大长度max_length
  • 队头位置head
  • 队尾位置tail
  • 数据存储data
#define MAX_LENGTH 10

typedef struct {
    int max_length;
    int head;
    int tail;
    int data[MAX_LENGTH];
}CircleQueue;

初始化

当创建一个空队列时,必须先将队列的头部和尾部位置都指向0,代表当前队列没有数据。

void init(CircleQueue *queue)
{
    queue->max_length = MAX_LENGTH;
    queue->head = 0;
    queue->tail = 0;
}

入队

当向队列里添加一个元素时,先判断队列是否已满,即队尾位置是否与队列最大长度相等。如果是,说明队列已满,无法添加新元素。否则,将新元素添加到队尾,同时更新队尾位置。

int enqueue(CircleQueue *queue, int value)
{
    if (queue->tail == queue->max_length) {
        printf("队列已满,无法添加元素\n");
        return -1;
    }
    queue->data[queue->tail] = value;
    queue->tail++;
    return 0;
}

出队

当从队列中删除一个元素时,先判断队列是否为空,即队头位置是否等于队尾位置。如果是,说明队列为空,没有元素可以被删除。否则,将队头元素删除,同时更新队头位置。

int dequeue(CircleQueue *queue, int *pvalue)
{
    if (queue->head == queue->tail) {
        printf("队列为空,没有元素可以被删除\n");
        return -1;
    }
    *pvalue = queue->data[queue->head];
    queue->head++;
    return 0;
}

示例说明

以下是一个使用顺序循环队列实现的队列的示例代码。通过该代码,可以更好地理解上述数据结构定义及入队、出队操作的逻辑。

#include <stdio.h>

#define MAX_LENGTH 10

typedef struct {
    int max_length;
    int head;
    int tail;
    int data[MAX_LENGTH];
}CircleQueue;

void init(CircleQueue *queue)
{
    queue->max_length = MAX_LENGTH;
    queue->head = 0;
    queue->tail = 0;
}

int enqueue(CircleQueue *queue, int value)
{
    if (queue->tail == queue->max_length) {
        printf("队列已满,无法添加元素\n");
        return -1;
    }
    queue->data[queue->tail] = value;
    queue->tail++;
    return 0;
}

int dequeue(CircleQueue *queue, int *pvalue)
{
    if (queue->head == queue->tail) {
        printf("队列为空,没有元素可以被删除\n");
        return -1;
    }
    *pvalue = queue->data[queue->head];
    queue->head++;
    return 0;
}

int main()
{
    CircleQueue queue;
    init(&queue);

    int value, i;
    for (i = 0; i < 11; i++) {
        if (enqueue(&queue, i) == -1) {
            break;
        }
    }

    for (i = 0; i < 11; i++) {
        if (dequeue(&queue, &value) == -1) {
            break;
        }
        printf("%d,", value);
    }
    return 0;
}

程序输出结果如下:

队列已满,无法添加元素
0,1,2,3,4,5,6,7,8,9,

该示例代码中,创建了一个队列,通过for循环往队列中添加了11个元素。当队列已满时,无法继续添加新元素。接着循环从队列中取出元素,并将取出的元素打印到屏幕上。在没有取出所有元素之前,如果队列为空,将停止取出元素。最终,程序输出了10个元素的值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现顺序循环队列实例 - Python技术站

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

相关文章

  • C 标准库 time.h

    time.h 是 C 标准库中的一个头文件,它提供了一系列函数来操作日期和时间。下面我们来详细讲解如何使用 time.h 标准库。 时间表示法 在 time.h 中,通常使用 time_t 类型来表示时间戳(timestamp),即表示从 1970 年 1 月 1 日 0 时 0 分 0 秒到某一个时间点所经过的秒数。时间戳可以用 time() 函数获取。 …

    C 2023年5月10日
    00
  • C语言实现动态开辟存储杨辉三角

    C语言实现动态开辟存储杨辉三角 杨辉三角又称帕斯卡三角,它是一个非常有趣的数学问题。杨辉三角如下所示: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 杨辉三角的每个数是它上方两个数的和。实现杨辉三角的一个方法是使用二维数组。然而,如果输入的行数较大,这将导致浪费大量的内存。因此,我们需要动态地分配内存。在这个教程中,…

    C 2023年5月23日
    00
  • 如何用c++表驱动替换if/else和switch/case语句

    当在编写C++代码时,经常需要使用if/else和switch/case语句对不同的条件进行处理。这些语句可以让程序员更加方便地编写逻辑代码。但是,当逻辑变得越来越复杂时,这些语句将变得越来越难以维护。因此,使用表驱动来代替if/else和switch/case语句将会变得更加方便和容易维护。 表驱动的思想是将输入值作为数组的下标,将对应的输出值存储在数组中…

    C 2023年5月23日
    00
  • 教你使用MongoDB导入导出备份数据

    MongoDB是一种非常流行的开源NoSQL数据库,它使用JSON样式的文档来存储数据,并支持数据导入、导出、备份等数据处理操作。本篇攻略将为大家介绍如何使用MongoDB导入导出备份数据。 准备工作 在进行数据导入导出的操作前,我们需要先准备好MongoDB的工具包,并确保MongoDB服务已经成功启动。同时,还需要确定要导入/导出/备份的数据库和集合。 …

    C 2023年5月23日
    00
  • C语言实现车辆信息管理系统

    C语言实现车辆信息管理系统攻略 1. 系统需求分析 在实现车辆信息管理系统之前,我们需要对系统进行需求分析,明确系统所需要实现的功能和对应的数据结构。下面是该系统的功能描述和数据结构设计: 功能描述 添加车辆信息 删除车辆信息 修改车辆信息 查询车辆信息 显示所有车辆信息 数据结构设计 车辆信息包括以下属性: 车牌号 车型 车主姓名 车主电话 因此,我们可以…

    C 2023年5月23日
    00
  • C C++中用户定义函数和库函数的区别

    C和C++中的函数可以分为两类:用户定义函数和库函数。用户定义函数是在程序中由程序员自己定义的函数,而库函数是指由语言或者由操作系统或者第三方提供的函数库中的函数。 下面详细讲解C和C++中用户定义函数和库函数的区别。 用户定义函数 用户定义函数是程序员自己定义的函数。用户定义函数有以下几个特点: 程序员自己定义,可以根据需求来定义函数名称、形参和返回值等。…

    C 2023年5月10日
    00
  • Win7升级Win10系统失败提示错误代码0x8007002c-0x4000D的解决方法

    Win7升级Win10系统失败提示错误代码0x8007002c-0x4000D的解决方法 在进行Win7升级Win10系统时,有时会出现错误代码0x8007002c-0x4000D的提示,这种情况一般是由于系统出现错误、网络连接问题以及硬件设备驱动问题等引起的。下面就为大家介绍几种常用的解决方法。 方法一:清理系统垃圾文件和重启系统 在升级Win10系统之前…

    C 2023年5月24日
    00
  • php中JSON的使用与转换

    当我们需要在不同的应用程序之间传输数据时,使用JSON(JavaScript对象表示)是一种非常流行的格式。PHP中的JSON函数使得解析和生成JSON数据非常容易。下面是使用和转换JSON数据的完整攻略。 1. 安装JSON扩展 在使用JSON之前,在PHP中安装JSON扩展是必要的。可以通过以下命令来检测JSON扩展是否已经安装。 php -m | gr…

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