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日

相关文章

  • JavaScript数据结构和算法之二叉树详解

    JavaScript数据结构和算法之二叉树详解 什么是二叉树? 二叉树是一种树形结构,其中每个节点最多有两个子节点:左子节点和右子节点。每个节点都是一个对象,包括属性和方法。节点的属性可能包括值,左节点和右节点。节点的方法可能包括插入和删除。 二叉树的应用场景 二叉树的常用场景包括: 排序算法(二叉排序树); 表达式求值; 线段树; 图形图像学; 数据压缩算…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表、栈、队列、树的实现方法示例

    Java数据结构之链表、栈、队列、树的实现方法示例 链表 链表是一种线性数据结构,由节点的集合构成。每个节点包含两部分,数据部分和指针部分。数据部分用于存储数据,指针部分用于指向下一个节点。 单向链表示例 public class LinkedList<E>{ private Node<E> head; private int siz…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构链表知识详解

    JavaScript数据结构链表知识详解 什么是链表 链表是一种线性结构,相比于数组,它不需要一块连续的内存空间,而是通过指针将一组零散的内存块串联起来使用。链表只保持一个指向链表中第一个节点的引用,每个节点则有指向下一个节点的指针。 链表的实现 链表的实现方式有很多种,下面介绍一种简单的单向链表实现方式,其中每个节点包含一个value属性和一个next属性…

    数据结构 2023年5月17日
    00
  • Java数据结构之线性表

    Java数据结构之线性表完整攻略 什么是线性表 线性表是n个数据元素的有限序列,其中数据元素的类型相同。线性表中含有首元素和末元素。若表中只有一个数据元素,则该数据元素既是首元素又是末元素,这个数据元素成为线性表的唯一元素。 线性表的基本操作 初始化操作 initList(List L):建立一个空的线性表L 插入操作 insert(List L, int …

    数据结构 2023年5月17日
    00
  • C语言数据结构之二叉树详解

    C语言数据结构之二叉树详解 什么是二叉树? 二叉树是一种非常常用的数据结构,它具有以下几个特点: 在二叉树中,每个节点最多有两个子节点,其中一个称为左子节点,另一个称为右子节点。 每个节点都有一个值,这个值可以是任意类型的,比如整数、字符、指针等等。 可以使用递归的方式来遍历一个二叉树,具体包括前序遍历、中序遍历和后序遍历。 二叉树的存储方式 二叉树可以使用…

    数据结构 2023年5月17日
    00
  • C++数据结构之红黑树的实现

    《C++数据结构之红黑树的实现》是一篇介绍红黑树实现的文章,通过本文,你可以了解到什么是红黑树以及如何实现红黑树。 什么是红黑树 红黑树是一种自平衡的二叉查找树,它具有良好的平衡性和查找性能。红黑树可以在O(log n)的时间内完成查找、插入和删除操作。 红黑树的一个重要性质是它的任何一个节点都有一个颜色(红色或黑色)属性。在插入、删除操作中,需要通过一定的…

    数据结构 2023年5月17日
    00
  • python学习数据结构实例代码

    “Python学习数据结构实例代码”的完整攻略如下: 1. 学习前提 在学习Python数据结构之前,需要具备一定的Python基础知识,包括语法、数据类型、操作符、控制流等基础知识。 2. 学习步骤 2.1 选择学习资料 可以选择阅读相关书籍或者参加在线课程来学习Python数据结构。推荐一些经典的学习资料: 《Python基础教程》第二版(作者:Magn…

    数据结构 2023年5月17日
    00
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解 本文将详细讲解C语言数据结构中单链表的操作方法,包括单链表的建立、遍历、插入、删除等操作,并提供两个示例进行说明。 单链表的定义 单链表是一种常见的动态数据结构,由若干节点组成,每个节点通常包含一个数据元素和一个指向下一个节点的指针。单链表最后一个节点的指针指向NULL,表示链表的结尾。 单链表的节点定义 单链表的节点通常由结…

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