C语言设计前中后队列实例代码

C语言设计前中后队列实例代码攻略

在本篇文章中,我们将学习如何在C语言中设计前、中、后队列,并提供相应的示例代码。下面将分别对前、中、后队列进行介绍和说明。

前队列

前队列,也称为顺序队列。它是一种数据结构,它具有先进先出(First in First Out,简称FIFO)的特点,是一种简单但基本的数据结构,常用在队列缓存、消息队列、web服务器等领域。下面是前队列的基本操作:

初始化队列

#define MAXSIZE 50 // 定义队列的最大长度
typedef struct {
    int data[MAXSIZE]; // 存放队列元素
    int front; // 队首指针
    int rear; // 队尾指针
} SqQueue;

void initQueue(SqQueue *q) { // 初始化队列
    q->front = q->rear = 0; // 初始化队首和队尾指针
}

判断队列是否为空

int isEmpty(SqQueue q) { // 判断队列是否为空
    if (q.front == q.rear) { // 如果队首和队尾相等,即为一个空队列
        return 1; // 返回真
    } else {
        return 0; // 返回假
    }
}

入队操作

int enQueue(SqQueue *q, int e) { // 入队操作
    if ((q->rear + 1) % MAXSIZE == q->front) { // 队列已满,无法入队
        return 0;
    }
    q->data[q->rear] = e; // 将元素e插入队尾位置
    q->rear = (q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位,取模运算是为了防止数组越界
    return 1;
}

出队操作

int deQueue(SqQueue *q, int *e) { // 出队操作
    if (isEmpty(*q)) { // 队列为空,无法出队
        return 0;
    }
    *e = q->data[q->front]; // 队首元素出队
    q->front = (q->front + 1) % MAXSIZE; // 队首指针向后移动一位,取模运算是为了防止数组越界
    return 1;
}

示例说明

下面是一个在前队列中入队5个元素,然后依次出队的操作:

int main() {
    int e; // 定义一个中间变量
    SqQueue q; // 定义一个队列
    initQueue(&q); // 初始化队列
    printf("队列是否为空:%d\n", isEmpty(q)); // 队列是否为空:1

    enQueue(&q, 1); // 入队操作
    enQueue(&q, 2);
    enQueue(&q, 3);
    enQueue(&q, 4);
    enQueue(&q, 5);

    printf("队列是否为空:%d\n", isEmpty(q)); // 队列是否为空:0

    while (!isEmpty(q)) { // 循环出队操作
        deQueue(&q, &e);
        printf("%d ", e);
    }

    return 0;
}

中队列

中队列的操作和前队列大部分相同,区别在于中队列在出队操作时,不是将队首元素出队,而是将队列中间位置的元素出队。由于中队列操作和前队列基本一致,这里我们不再赘述前队列中的操作。

出队操作

int deMidQueue(SqQueue *q, int *e) { // 出队操作
    if (isEmpty(*q)) { // 队列为空,无法出队
        return 0;
    }
    int mid = (q->front + q->rear - 1) / 2; // 中间位置的下标
    *e = q->data[mid]; // 中间位置元素出队
    for (int i = mid; i < q->rear - 1; i++) { // 将中间位置后面的元素依次向前移动一位
        q->data[i] = q->data[i+1];
    }
    q->rear--; // 将队尾指针向前移动一位
    return 1;
}

示例说明

下面是一个在中队列中入队5个元素,然后依次出队的操作:

int main() {
    int e; // 定义一个中间变量
    SqQueue q; // 定义一个队列
    initQueue(&q); // 初始化队列
    printf("队列是否为空:%d\n", isEmpty(q)); // 队列是否为空:1

    enQueue(&q, 1); // 入队操作
    enQueue(&q, 2);
    enQueue(&q, 3);
    enQueue(&q, 4);
    enQueue(&q, 5);

    printf("队列是否为空:%d\n", isEmpty(q)); // 队列是否为空:0

    while (!isEmpty(q)) { // 循环出队操作
        deMidQueue(&q, &e);
        printf("%d ", e);
    }

    return 0;
}

后队列

后队列,又称为链队列。在后队列链表中,队列的两端都定义在链表的两个头部,不仅需要维持队头指针,还要维护队尾指针。与前队列和中队列不同,后队列在出队操作时只是将队首元素出队,并且队列为空的判断也不同。下面是后队列的基本操作:

定义一个链表节点

typedef struct node {
    int data; // 存放元素值
    struct node *next; // 指向下一个节点
}QNode;

定义队列

typedef struct {
    QNode *front; // 队首指针
    QNode *rear; // 队尾指针
} LinkQueue;

void initQueue(LinkQueue *q) { // 初始化队列
    QNode *head = (QNode *)malloc(sizeof(QNode));
    head->next = NULL;
    q->front = q->rear = head;
}

判断队列是否为空

int isEmpty(LinkQueue q) { // 判断队列是否为空
    if (q.front == q.rear) { // 如果队首和队尾相等,即为一个空队列
        return 1; // 返回真
    } else {
        return 0; // 返回假
    }
}

入队操作

int enQueue(LinkQueue *q, int e) { // 入队操作
    QNode *p = (QNode *)malloc(sizeof(QNode)); // 创建新节点
    p->data = e; // 将元素插入节点中
    p->next = NULL; // 在链表末尾添加新节点
    q->rear->next = p; // 更新队尾指针
    q->rear = p;
    return 1;
}

出队操作

int deQueue(LinkQueue *q, int *e) { // 出队操作
    if (isEmpty(*q)) { // 队列为空,无法出队
        return 0;
    }
    QNode *p = q->front->next; // 获取队首节点
    *e = p->data; // 队首元素出队
    q->front->next = p->next; // 更新队首指针
    if (q->rear == p) q->rear = q->front; // 如果队首指针指向的是链表中的最后一个节点,则更新队尾指针
    free(p); // 释放空间
    return 1;
}

示例说明

下面是一个在后队列中入队5个元素,然后依次出队的操作:

int main() {
    int e; // 定义一个中间变量
    LinkQueue q; // 定义一个队列
    initQueue(&q); // 初始化队列
    printf("队列是否为空:%d\n", isEmpty(q)); // 队列是否为空:1

    enQueue(&q, 1); // 入队操作
    enQueue(&q, 2);
    enQueue(&q, 3);
    enQueue(&q, 4);
    enQueue(&q, 5);

    printf("队列是否为空:%d\n", isEmpty(q)); // 队列是否为空:0

    while (!isEmpty(q)) { // 循环出队操作
        deQueue(&q, &e);
        printf("%d ", e);
    }

    return 0;
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言设计前中后队列实例代码 - Python技术站

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

相关文章

  • C语言进阶教程之循环语句缺陷详析

    下面我将为您详细讲解Markdown文本格式的“C语言进阶教程之循环语句缺陷详析”的完整攻略。 C语言进阶教程之循环语句缺陷详析 引言 在日常的C语言编程中,循环语句是必须要掌握的语法之一。但是,在循环语句中也常常会发生一些缺陷,这些缺陷可能会导致程序出现错误甚至崩溃。本文将详细讲解循环语句中常见的缺陷及其解决方法。 while循环中不加判断条件 当使用wh…

    C 2023年5月22日
    00
  • 详解c++20协程如何使用

    详解C++20协程如何使用 简介 C++20协程是C++20新特性之一,它提供了更加高效的异步编程模型。在C++20中,协程这个概念被引入了语言标准,对于需要高效异步编程的任务,使用协程可以更加便捷地完成。 本文主要介绍C++20协程的基本概念、使用方法以及示例代码。 协程概念 协程(Coroutine),也称为替代栈(Stackless)协程,是一种比线程…

    C 2023年5月22日
    00
  • 常用的C语言编程工具汇总

    常用的C语言编程工具汇总 概述 C语言是一种非常流行的高级编程语言,开发者们常常使用各种工具来编写、调试、测试他们的C代码。在这里我们进行简单的介绍,列出一些主要的C语言编程工具及其用途。 编辑器 编辑器是C语言编程过程中最基本的工具之一。通常用来编写代码。常用的C语言编辑器有: 1. Visual Studio Code Visual Studio Cod…

    C 2023年5月23日
    00
  • 使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    这里提供一个使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小的攻略,具体步骤如下: 步骤1:初始化Direct3D 使用Direct3D获取屏幕截图需要初始化Direct3D,示例代码如下: // 引入Direct3D #include <d3d9.h> #pragma comment(lib, "d…

    C 2023年5月23日
    00
  • C语言指向常量的指针

    针对C语言指向常量的指针,我来给出一份详细的使用攻略。 什么是指向常量的指针? 指向常量的指针是指它所指向的内存位置中的数据不能被改变的指针。也就是说,指针本身是可以改变的,但是指针指向的数据是无法通过这个指针来修改的。 在C语言中,我们常用const关键字来声明一个常量。指向常量的指针就是指向这些常量的指针,我们通常使用const关键字来定义这些指向常量的…

    C 2023年5月9日
    00
  • C++中类的成员函数及内联函数使用及说明

    下面我就来为您详细讲解C++中类的成员函数及内联函数使用及说明的攻略。 类成员函数的定义 在C++中,类的成员函数可以在类的定义中进行声明,并在类外定义函数实现。类成员函数的定义格式如下: class ClassName { public: ReturnType functionName(ParameterList); //… }; ReturnType…

    C 2023年5月22日
    00
  • C++的头文件和实现文件详解

    C++的头文件和实现文件是C++程序开发非常重要的组成部分之一。头文件是用于解释并声明函数和变量的文件,而实现文件则是用于实现函数定义的文件。下面就让我来给大家讲解一下这方面的攻略。 头文件详解 头文件的作用 首先,我们来讲一下头文件的作用。头文件是用于声明和定义变量、函数和类的文件。头文件包含了类型定义,函数声明和变量声明等内容。通常,头文件放在程序的最开…

    C 2023年5月23日
    00
  • php格式化json函数示例代码

    PHP格式化JSON函数示例代码 在PHP中,有一个很方便的函数可以帮助我们格式化JSON字符串。这个函数就是json_encode()。它使用非常简单,只需要将我们要格式化的JSON对象传入函数中即可。 例如,我们有一个如下所示的JSON字符串: { "name": "Tom", "age": 3…

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