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日

相关文章

  • snprintf函数的用法解析

    让我来向你介绍一下snprintf函数的用法解析。 什么是snprintf函数 snprintf是一个C库函数,用于格式化字符串并将结果输出到指定缓冲区。与printf函数不同的是,snprintf在输出的同时将结果存储在指定缓冲区中。它可以避免缓冲区溢出,因为在输出到缓冲区之前已经设置了输出的最大长度。 该函数的原型为: int snprintf(char…

    C 2023年5月22日
    00
  • 一篇文章彻底弄懂C++虚函数的实现机制

    一篇文章彻底弄懂C++虚函数的实现机制 介绍 C++的虚函数是实现多态的重要途径,本文将深入浅出地介绍C++虚函数的实现机制,希望能给大家带来一些帮助。 基本概念 静态绑定和动态绑定 在C++中,有两种绑定方式,即静态绑定(也称为静态链接)和动态绑定(也称为动态链接)。 静态绑定是指在编译期间确定函数的调用地址。这种方式的优点是执行速度快,缺点是不支持多态。…

    C 2023年5月23日
    00
  • Visual C++ 6.0无法正常启动提示0xc0000142怎么办?vc6.0无法执行程序解决方法

    Visual C++ 6.0无法正常启动提示0xc0000142怎么办? 当你在使用 Visual C++ 6.0 运行程序时,可能会遇到“无法正常启动,错误代码为 0xc0000142”的提示信息。出现这个问题的原因多种多样,可能是操作系统或 Visual C++ 本身的问题。下面我们来一步步解决这个问题。 步骤一:升级 Visual C++ 6.0 首先…

    C 2023年5月23日
    00
  • C语言中字符串库函数的实现及模拟

    C语言中字符串库函数的实现及模拟攻略 1. 字符串函数简介 C语言中的字符串函数是用来处理字符串的函数库,其中包含了很多有用的函数,例如字符串复制函数strcpy、字符串拼接函数strcat、字符串比较函数strcmp等等,这些函数使得字符串的处理变得更加简单、高效和方便。 2. C语言中字符串函数的实现 下面是几个常用的字符串函数的实现方法。 2.1 st…

    C 2023年5月23日
    00
  • C 程序 查找两个数字的平均值

    C程序 查找两个数字的平均值 这是一个简单的C语言程序,用于计算两个数字的平均值。 准备工作 为了运行这个程序,你需要安装C语言的编译器,例如gcc。 你可以在终端中输入以下命令检查是否已经安装: gcc -v 如果出现以下提示信息,说明已经安装: gcc version xxx 如果没有安装,请使用以下命令安装: sudo apt-get update s…

    C 2023年5月9日
    00
  • ubuntu下如何安装cmake?cmake简单使用详解

    下面是详细的攻略: 安装cmake的方法 在Ubuntu系统中,我们可以使用apt-get命令来安装cmake。具体步骤如下: 打开终端,输入以下命令: sudo apt-get update 该命令用于更新Ubuntu系统中的软件包信息,确保我们能够获得最新的cmake软件包。 安装cmake,输入以下命令: sudo apt-get install cm…

    C 2023年5月24日
    00
  • 举例讲解C语言的fork()函数创建子进程的用法

    当我们编写多进程程序时,经常需要使用fork()函数创建子进程。在此为大家详细讲解C语言的fork()函数创建子进程的用法。 什么是fork()函数? fork()函数是一个创建进程的系统调用,调用一次生成两个进程(一个子进程和一个父进程)。两个进程都执行fork()调用后的下一条语句。这个新进程几乎与原先的进程完全一样,除了它有自己独特的进程ID,PID和…

    C 2023年5月23日
    00
  • c/c++获取系统时间函数的方法示例

    获取系统时间是编程中常用的功能之一,c/c++提供了多种方法来获取系统时间。下面将介绍获取系统时间的常用方法。 获取系统时间的常用函数 1. time() time()函数返回从1970年1月1日0时0分0秒到当前时间的秒数。time函数的详细定义如下: #include <time.h> time_t time(time_t *timer); …

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