C利用语言实现数据结构之队列

C语言实现队列的完整攻略

什么是队列

队列是一种线性数据结构,它有两个端点:队头和队尾。新的元素插入到队尾,每次从队头取出一个元素。这就类似于人们排队买票,新的买票者排在队尾,每当售票员完成一笔交易,队列头的买票者出队。

基本操作

队列主要有以下3个基本操作:

  • 入队(enqueue):将一个元素添加到队列的尾部
  • 出队(dequeue):从队列的头部移除一个元素
  • 队列是否为空(isEmpty):判断队列是否为空

实现队列

我们可以利用C语言的数组来实现队列。首先定义一个结构体,包含队列元素、队头、队尾以及队列最大容量:

#define MAX_SIZE 10
typedef struct {
    int data[MAX_SIZE]; // 存放元素的数组
    int front; // 队头索引
    int rear; // 队尾索引
    int size; // 队列当前大小
}queue;

然后,我们可以依照上面的基本操作实现队列:

// 初始化队列
void init(queue* q) {
    q->front = 0;
    q->rear = 0;
    q->size = 0;
}

// 判断队列是否为空
bool isEmpty(const queue* q) {
    return q->size == 0;
}

// 判断队列是否已满
bool isFull(const queue* q) {
    return q->size == MAX_SIZE;
}

// 入队
bool enqueue(queue* q, int element) {
    if(isFull(q)) {
        return false;
    }
    q->data[q->rear] = element;
    q->rear = (q->rear+1)%MAX_SIZE; // 循环队列,如果超出队列最大容量则从头开始
    q->size++;
    return true;
}

// 出队
bool dequeue(queue* q) {
    if(isEmpty(q)) {
        return false;
    }
    q->front = (q->front+1)%MAX_SIZE;
    q->size--;
    return true;
}

// 获取队头元素
int front(const queue* q) {
    if(isEmpty(q)) {
        return 0;
    }
    return q->data[q->front];
}

示例

示例一:实现队列的基本操作

#include<stdio.h>
#include<stdbool.h>

#define MAX_SIZE 10
typedef struct {
    int data[MAX_SIZE]; // 存放元素的数组
    int front; // 队头索引
    int rear; // 队尾索引
    int size; // 队列当前大小
}queue;

// 初始化队列
void init(queue* q) {
    q->front = 0;
    q->rear = 0;
    q->size = 0;
}

// 判断队列是否为空
bool isEmpty(const queue* q) {
    return q->size == 0;
}

// 判断队列是否已满
bool isFull(const queue* q) {
    return q->size == MAX_SIZE;
}

// 入队
bool enqueue(queue* q, int element) {
    if(isFull(q)) {
        return false;
    }
    q->data[q->rear] = element;
    q->rear = (q->rear+1)%MAX_SIZE; // 循环队列,如果超出队列最大容量则从头开始
    q->size++;
    return true;
}

// 出队
bool dequeue(queue* q) {
    if(isEmpty(q)) {
        return false;
    }
    q->front = (q->front+1)%MAX_SIZE;
    q->size--;
    return true;
}

// 获取队头元素
int front(const queue* q) {
    if(isEmpty(q)) {
        return 0;
    }
    return q->data[q->front];
}

int main() {
    queue q;
    init(&q);
    printf("队列是否为空:%d\n", isEmpty(&q)); // 1,队列为空
    enqueue(&q, 1);
    enqueue(&q, 2);
    printf("队列是否为空:%d\n", isEmpty(&q)); // 0,队列不为空
    printf("队列的大小:%d\n", q.size); // 2
    printf("队头元素:%d\n", front(&q)); // 1
    dequeue(&q);
    printf("队头元素:%d\n", front(&q)); // 2
    printf("队列的大小:%d\n", q.size); // 1
    printf("队列是否为空:%d\n", isEmpty(&q)); // 0,队列不为空
    dequeue(&q);
    printf("队列是否为空:%d\n", isEmpty(&q)); // 1,队列为空
    return 0;
}

示例二:使用队列完成约瑟夫环(n个人围成一个环,从第1个人开始报数,报到m的人出圈,直到所有人出圈)

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

#define MAX_SIZE 100

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

int main() {
    int n,m;
    printf("请输入n和m的值:");
    scanf("%d%d", &n, &m);
    queue q;
    q.front = 0;
    q.rear = 0;
    q.size = 0;
    for(int i=1; i<=n; i++) {
        enqueue(&q,i);
    }
    int count = 0;
    while(!isEmpty(&q)) {
        int x = front(&q);
        dequeue(&q);
        count++;
        if(count == m) {
            printf("%d ", x);
            count = 0;
        }
        else {
            enqueue(&q,x);
        }
    }
    return 0;
}

注意:在示例二中,我们使用了单独的enqueue和dequeue函数来实现队列操作。这是因为该示例中没有采用完整的队列结构体,而仅仅是利用数组存储队列元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C利用语言实现数据结构之队列 - Python技术站

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

相关文章

  • c++ 数据结构map的使用详解

    c++ 数据结构map的使用详解 什么是map map是C++ STL中提供的一种用以存储键值对(key-value)的容器。它能够以平均O(log n)复杂度进行搜索、插入、删除操作,并且保持元素顺序,是一种比较高效的数据结构。 map的基本用法 定义map 定义map需要包含头文件<map>。 语法:map<key_type, valu…

    数据结构 2023年5月17日
    00
  • Python数据结构之翻转链表

    对于“Python数据结构之翻转链表”的完整攻略,我会按照以下顺序进行讲解: 1.什么是链表? 2.如何翻转链表? 3.示例1:翻转一个简单的链表 4.示例2:翻转一个带环的链表 5.如何在Python中实现翻转链表? 接下来,我会详细讲解每个部分。 什么是链表? 链表是一种数据结构,它由一系列的节点组成,每个节点包含了数据和指向下一个节点的指针。链表有很多…

    数据结构 2023年5月17日
    00
  • MySQL 数据库的基础知识

    下面是针对MySQL数据库基础知识的攻略。 什么是MySQL MySQL是一种常用的开源的关系型数据库管理系统 (RDBMS),通常被用于网站开发、数据储存和其他广泛的应用领域。 安装MySQL 要使用MySQL,需要首先在你的电脑上安装它。MySQL在Windows、macOS和Linux系统上都有提供安装文件,你可以前往MySQL官网下载安装器按步骤完成…

    数据结构 2023年5月17日
    00
  • C数据结构之双链表详细示例分析

    作为本网站的作者,我很高兴为你讲解C数据结构之双链表详细示例分析的完整攻略。 双链表简介与定义 双链表是链表的一种,在链表中每一个节点都有一个指针域,指向下一个节点,这个指针域称为next指针;而在双链表中每一个节点也有两个指针域,一个指向前驱节点,另一个指向后继节点,即prev指针与next指针。由于双链表存在两个指针域,因此它支持双向遍历,无论是正向还是…

    数据结构 2023年5月17日
    00
  • 蒙特卡罗方法:当丢失确定性时的处理办法

    一、简介   蒙特卡罗(Monte Carlo),也可翻译为蒙特卡洛,只是不同的音译选词,比较常用的是蒙特卡罗。是摩洛哥的一片城区,以拥有豪华赌场闻名,蒙特卡罗方法是基于概率的。基本思想:如果你想预测一件事情的结果,你只要把随机生成的各种输入值,把这件事模拟很多遍,根据模拟出的结果就可以看到事情的结果大致是什么情况。蒙特卡罗算法是基于蒙特卡罗方法的算法。 二…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之对象的比较

    Java数据结构之对象的比较 在Java中,对象的比较是非常重要的操作。我们常常需要对不同的对象进行比较,以便对它们进行排序、按照某个条件过滤等操作。本文将详细讲解Java中对象的比较,并给出一些示例来说明。 对象的比较方法 Java中有两种对象比较方法:值比较和引用比较。值比较就是比较两个对象的值是否相等,而引用比较是比较两个对象是否是同一个对象。 值比较…

    数据结构 2023年5月17日
    00
  • MySQL索引详解及演进过程及面试题延伸

    MySQL索引详解及演进过程及面试题延伸 索引的作用 在 MySQL 中,索引是一种数据结构,可用于快速查找和访问表中的数据。使用索引可以大大提高查询效率,特别是在大型数据表中。 索引可以看作是一本书中的目录,目录中列出了每个章节的页码,通过查询目录,读者可以快速找到感兴趣的章节。 索引的种类 MySQL 中支持多种类型的索引,下面我们介绍一下常见的索引类型…

    数据结构 2023年5月17日
    00
  • Java实现链表数据结构的方法

    Java实现链表数据结构的方法可以分为以下步骤: 定义链表节点类Node 首先,在Java中实现链表数据结构,需要定义一个链表节点类,称为Node。Node类中包含两个重要属性: 数据域data,用于存储每个节点的数据信息。 指针域next,用于存储下一个节点的引用。 代码示例: public class Node { public int data; //…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部