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日

相关文章

  • F – 产生冠军(不使用拓扑排序)

    题目描述 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。球赛的规则如下:如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之…

    算法与数据结构 2023年4月17日
    00
  • Python实现的数据结构与算法之基本搜索详解

    Python实现的数据结构与算法之基本搜索详解 在计算机科学中,搜索指的是在一组数据中找到目标数据的过程。搜索算法是解决各种问题的关键,即使是拼图游戏和图像识别也要依赖搜索算法。本文将介绍基本的搜索算法,包括线性/顺序搜索、二分搜索和广度优先搜索。 线性/顺序搜索 顺序搜索又称为线性搜索,它遍历整个数据集以查找特定元素。顺序搜索可以用于查找未排序的列表。该算…

    数据结构 2023年5月17日
    00
  • Java数据结构之List的使用总结

    非常感谢您对本网站的关注。Java数据结构之List的使用总结是一个非常重要的主题,这里将为您详细介绍。 1. List是什么 在Java中,List是一种非常实用的数据结构,它代表了一个元素的有序集合,其中的每个元素都可以用一个整数索引来标识。List允许多个元素重复,同时还可以在集合的任意位置插入或者删除元素。 Java中的List主要分为两类:Arra…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表的概念及结构

    Java数据结构之链表的概念及结构 链表的概念 链表是一种非顺序存储的容器,它由一个个结点组成,每个结点包含两部分,数据域和指针域。数据域是存储数据的部分,指针域是指向下一个结点的位置。 相比于数组,链表插入和删除操作的时间复杂度更低,但是访问元素时需要遍历整个链表,时间复杂度相对较高。 链表的结构 链表结构包含两个重要的部分:结点和链表。 结点(Node)…

    数据结构 2023年5月16日
    00
  • Java 数据结构链表操作实现代码

    下面是关于“Java 数据结构链表操作实现代码”的完整攻略。 1.链表实现原理 链表是一种经典的数据结构,其主要原理是通过指针将一系列节点连接起来。链表中的节点包含两个部分,一个是数据域,用于存放数据;另一个是指针域,用于指向下一个节点的位置。链表的头结点指向链表的第一个节点,最后一个节点的指针指向空。 2.链表的基本操作 链表的基本操作包括创建链表、插入节…

    数据结构 2023年5月17日
    00
  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 前言 顺序数组是数据结构的一个重要部分,它代表着一种基本的数据结构,能够在数据存储与访问方面发挥极大的作用。本文将详细讲解如何在C语言中实现顺序数组。 简介 顺序数组是在物理内存中顺序存储的一组元素数据,可以通过下标访问任意一个元素。通常情况下,顺序数组的数据类型是相同的,而且每一个元素的大小也是相同的。 实现 实现顺序数组主…

    数据结构 2023年5月17日
    00
  • 数据结构 红黑树的详解

    数据结构:红黑树的详解攻略 一、红黑树的定义 红黑树是一种二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。红黑树的特征是对于任何有效的红黑树,从根到叶子结点或空子结点的每条路径都包含相同数目的黑色结点。 二、插入操作 对于新插入的节点,将其涂红并插入红黑树中,然后按照二叉搜索树的规则将其插入到红黑树中。 如果父节点是黑色,则不需…

    数据结构 2023年5月17日
    00
  • C语言单链队列的表示与实现实例详解

    C语言单链队列的表示与实现实例详解 什么是队列? 在计算机科学中,队列(Queue)是一种特殊的数据结构,它只允许在一端进行插入操作,在另一端进行删除操作。将新元素插入队列的过程可以称之为入队,而将元素从队列中删除的过程则可以称之为出队。队列的核心思想是“先进先出”(First In First Out,FIFO),即先入队的元素先出队。 单链队列的表示方式…

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