C语言实现循环队列基本操作

C语言实现循环队列基本操作

循环队列是一种常用的队列数据结构,其基本结构与普通队列类似,只不过队列的尾指针位置是循环的。即当尾指针指向队列的最后一个位置时,再有新的元素进入队列时,尾指针会回到队列头的位置。

在C语言中,我们可以通过使用数组与指针的结合,来实现循环队列的基本操作。下面我们就来详细讲解一下C语言实现循环队列的完整攻略。

定义循环队列

我们首先需要定义一个循环队列的结构体,来存储队列的基本信息,例如队首与队尾的位置以及队列的容量等。

#define QUEUE_SIZE 10 
struct CircularQueue {
    int arr[QUEUE_SIZE];
    int front, rear;
    int count;
};

在上述代码中,我们定义了一个叫做CircularQueue的结构体,其中包含了一个长度为QUEUE_SIZE的数组arr,用来存储队列中的元素;变量front表示队列的队首位置;变量rear表示队列的队尾位置;变量count表示当前队列中已有元素的数量。

初始化循环队列

在定义完循环队列结构体后,我们需要对队列进行初始化,将队首与队尾等指针位置设置为0,将计数器count设置为0。

void initQueue(struct CircularQueue *q) {
    q->front = 0;
    q->rear = 0;
    q->count = 0;
}

添加元素

在循环队列中添加元素的过程,需要考虑队列已满的情况。当队列已满时,我们需要通过将队尾位置回到队列的开头,来实现循环效果。

bool enqueue(struct CircularQueue *q, int x) {
    if (q->count == QUEUE_SIZE) {
        printf("Queue is full.");
        return false;
    }
    q->arr[q->rear] = x;
    q->rear = (q->rear + 1) % QUEUE_SIZE;
    q->count++;
    return true;
}

在上述代码中,我们首先判断队列是否已满,若已满则输出提示信息并返回false,否则将新的元素添加到队尾,并将队尾位置更新为下一个位置,同时将计数器count加1。

删除元素

在循环队列中删除元素的过程,同样需要考虑队列为空的情况。当队列为空时,无法进行删除操作。

bool dequeue(struct CircularQueue *q) {
    if (q->count == 0) {
        printf("Queue is empty.");
        return false;
    }
    q->front = (q->front + 1) % QUEUE_SIZE;
    q->count--;
    return true;
}

在上述代码中,我们首先判断队列是否为空,若为空则输出提示信息并返回false,否则将队首位置更新为下一个位置,并将计数器count减1。

示例1:循环队列的初始化与元素添加

现在我们来进行一个简单的循环队列操作示例,展示如何初始化一个循环队列并添加元素。

#include <stdio.h>
#include <stdbool.h>
#define QUEUE_SIZE 10 
struct CircularQueue {
    int arr[QUEUE_SIZE];
    int front, rear;
    int count;
};
void initQueue(struct CircularQueue *q) {
    q->front = 0;
    q->rear = 0;
    q->count = 0;
}
bool enqueue(struct CircularQueue *q, int x) {
    if (q->count == QUEUE_SIZE) {
        printf("Queue is full.");
        return false;
    }
    q->arr[q->rear] = x;
    q->rear = (q->rear + 1) % QUEUE_SIZE;
    q->count++;
    return true;
}
int main() {
    struct CircularQueue q;
    initQueue(&q);
    // 添加元素
    enqueue(&q, 1);
    enqueue(&q, 2);
    enqueue(&q, 3);
    return 0;
}

在上述代码中,我们首先定义了一个循环队列结构体CircularQueue,定义了初始化函数initQueue以及元素添加函数enqueue。在main函数中,我们先初始化了一个新队列,并通过调用enqueue函数来将三个元素添加到队列中。

示例2:循环队列的初始化与元素删除

除了添加元素,循环队列的另一个基本操作是删除元素。接下来我们通过一个示例来展示如何初始化循环队列并删除元素。

#include <stdio.h>
#include <stdbool.h>
#define QUEUE_SIZE 10 
struct CircularQueue {
    int arr[QUEUE_SIZE];
    int front, rear;
    int count;
};
void initQueue(struct CircularQueue *q) {
    q->front = 0;
    q->rear = 0;
    q->count = 0;
}
bool dequeue(struct CircularQueue *q) {
    if (q->count == 0) {
        printf("Queue is empty.");
        return false;
    }
    q->front = (q->front + 1) % QUEUE_SIZE;
    q->count--;
    return true;
}
int main() {
    struct CircularQueue q;
    initQueue(&q);
    enqueue(&q, 1);
    enqueue(&q, 2);
    enqueue(&q, 3);
    // 删除元素
    dequeue(&q);
    dequeue(&q);
    return 0;
}

在上述代码中,我们同样定义了一个循环队列结构体CircularQueue,定义了初始化函数initQueue以及元素删除函数dequeue。在main函数中,我们先初始化了一个新队列,并通过调用enqueue函数将三个元素添加到队列中。之后我们调用dequeue函数来删除两个元素。注意,在执行删除操作前,我们需要判断队列是否为空。

通过上述两个示例,我们可以看到如何在C语言中实现循环队列的基本操作。当然,我们还可以通过其他方式来实现循环队列,例如使用链表来存储队列,但相比于数组实现方式,链表实现方式消耗的空间较大,实现难度也更大。因此,在性能与易用性方面,数组实现是循环队列最常用的方式之一。

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

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

相关文章

  • 整型数据在内存中存储方式的讲解

    当我们声明一个整型变量时,计算机会在内存中分配一段连续的存储空间来存储该变量的值。在C语言中,整型数据的存储空间占用长度是根据数据类型决定的,在32位系统中一般为4字节(32位),在64位系统中一般为8字节(64位)。 整型数据在内存中存储方式是使用二进制补码表示。 二进制补码是一种表示有符号整数的方法,它对一个数的正负没有区别,而且在计算机中操作速度更快,…

    C 2023年5月23日
    00
  • python非单一.py文件用Pyinstaller打包发布成exe

    下面是“Python非单一.py文件用Pyinstaller打包发布成exe”的完整攻略。 什么是Pyinstaller PyInstaller是一个Python应用程序的打包工具。它可以将Python程序打包成单个可执行文件,这让你可以方便地将Python程序发布给其他人,而不需要他们安装Python环境。 Pyinstaller的安装 在安装Pyinst…

    C 2023年5月22日
    00
  • Java日常练习题,每天进步一点点(26)

    这篇文章是一篇介绍Java练习题的攻略文章,该文章共包含26个练习题,每天练习一道题目,可以逐步提高自己的Java编程能力。下面我将介绍每一道题目的解题思路和注意点。 题目1:将一个字符串进行反转 这道题目的解题思路是: 1.将字符串转化为字符数组 2.将数组逆序 3.将数组转化为字符串 代码示例: public class Practice1 { publ…

    C 2023年5月23日
    00
  • C#向线程中传递多个参数的解决方法(两种)

    “C#向线程中传递多个参数的解决方法(两种)”是一个较为常见的问题,下面我将详细讲解其中的两种解决方案。 方案一:使用元组(Tuple) 在 C# 中,我们可以使用元组来将多个参数打包成一个参数,然后将该元组作为参数传递给线程。代码如下: private void StartThreadWithTuple() { // 创建包含多个参数的元组 var tup…

    C 2023年5月22日
    00
  • C语言双向链表的表示与实现实例详解

    C语言双向链表的表示与实现实例详解 一、概述 双向链表(doubly linked list)是一种链式存储结构,与单向链表类似,但每个节点不仅包含了一个指向下一个节点的指针,还包含了一个指向前一个节点的指针。这样可以方便地在链表的前后进行遍历和操作。 本篇攻略将详细讲解C语言双向链表的表示与实现。包括链表的结构定义、操作实现和两个示例说明。 二、结构定义 …

    C 2023年5月23日
    00
  • C++实现图书管理系统最新版

    C++实现图书管理系统最新版 简介 本文将会详细讲解如何使用C++实现一个简单的图书管理系统。此系统模拟了图书馆的基本管理功能,具有管理图书、借阅图书、归还图书等功能。 实现步骤 创建一个C++项目,并在项目中新建一个名为 book.h 的头文件。 在 book.h 中定义一个 Book 结构体,包含以下属性:* int book_id:图书编号* stri…

    C 2023年5月23日
    00
  • jQuery解析Json实例详解

    下面是《jQuery解析Json实例详解》的完整攻略。 1. 什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript语言的一个子集。 2. jQuery解析JSON数据的方法 jQuery提供了专门的方法用于解析JSON数据,这个方法叫做$.parseJSON(),它能将符合JS…

    C 2023年5月23日
    00
  • C enum(枚举)

    下面详细讲解一下C语言中枚举(enum)的完整使用攻略。 枚举的定义 C语言中的枚举是一种用户自定义的数据类型,它允许我们定义一组命名的常量。枚举常量被称为枚举值(enum value)。 在C语言中枚举的定义格式为: enum 枚举类型名{ 枚举值1, 枚举值2, …… 枚举值n }; 其中,枚举类型名是一个标识符,它是这个枚举类型的名称;枚举值是一组常量…

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