C语言详解链式队列与循环队列的实现

C语言详解链式队列与循环队列的实现

链式队列的实现

链式队列是一种使用链表实现的队列。这种队列没有静态数组的限制,可以动态地添加或删除元素。

链式队列的定义

链式队列可以通过定义一个结构体来表示:

typedef struct node{
    int data;                   // 存放队列元素的数据
    struct node *next;          // 存放下一个元素的地址
}Node;                          // 队列元素的类型

typedef struct linked_queue{
    Node *front;                // 队头指针
    Node *rear;                 // 队尾指针
}LinkedQueue;                    // 队列类型

队列的初始化实现如下:

void InitQueue(LinkedQueue *q){
    q->front = q->rear = (Node*)malloc(sizeof(Node));
    q->front->next = NULL;
}

入队操作

当队列为空时,要插入的元素既是队头又是队尾。其他情况下,只需在队尾插入元素即可。

void EnQueue(LinkedQueue *q, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
}

出队操作

当队列为空时,无法进行出队操作。

int DeQueue(LinkedQueue *q){
    if(q->front == q->rear)  return -1; // 队列为空
    Node *p = q->front->next;
    int x = p->data;
    q->front->next = p->next;
    if(q->rear == p)    q->rear = q->front;
    free(p);
    return x;
}

循环队列的实现

循环队列可以使用静态数组来实现,是一种较为常用的队列实现方式。队列的头尾相连成一个环,可以循环利用数组空间,提高队列的利用率。

循环队列的定义

循环队列也可以通过定义一个结构体来表示:

typedef struct circular_queue{
    int *data;      // 存放队列元素的数组
    int front;      // 队头指针
    int rear;       // 队尾指针
    int size;       // 队列容量
}CircularQueue;     // 队列类型

队列的初始化实现如下:

void InitQueue(CircularQueue *q, int size){
    q->data = (int*)malloc(size * sizeof(int));
    q->front = q->rear = 0;
    q->size = size;
}

入队操作

当队列为空时,无论第一个插入的元素是哪个,队头与队尾都指向该元素。在队列不满的情况下,队尾指针右移,将新元素插入当前队尾的下一个位置。

bool EnQueue(CircularQueue *q, int x){
    if((q->rear + 1) % q->size == q->front)   return false; // 队列满
    q->data[q->rear] = x;
    q->rear = (q->rear + 1) % q->size;
    return true;
}

出队操作

当队列为空时,无法进行出队操作。在队列不空的情况下,队头指针右移,返回当前队头元素。

bool DeQueue(CircularQueue *q, int *x){
    if(q->front == q->rear)   return false; // 队列空
    *x = q->data[q->front];
    q->front = (q->front + 1) % q->size;
    return true;
}

示例说明

链式队列示例

下面是一个使用链式队列计算阶乘的示例:

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

typedef struct node{
    int data;
    struct node *next;
}Node;

typedef struct linked_queue{
    Node *front;
    Node *rear;
}LinkedQueue;

void InitQueue(LinkedQueue *q){
    q->front = q->rear = (Node*)malloc(sizeof(Node));
    q->front->next = NULL;
}

void EnQueue(LinkedQueue *q, int x){
    Node *p = (Node*)malloc(sizeof(Node));
    p->data = x;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;
}

int DeQueue(LinkedQueue *q){
    if(q->front == q->rear)  return -1;
    Node *p = q->front->next;
    int x = p->data;
    q->front->next = p->next;
    if(q->rear == p)    q->rear = q->front;
    free(p);
    return x;
}

int Fac(int n){
    LinkedQueue q;
    InitQueue(&q);                  // 定义链式队列
    EnQueue(&q, 1);                 // 先将1入队
    int f = 1;
    while(n--){
        int x = DeQueue(&q);        // 出队
        f *= x;                     // 阶乘
        EnQueue(&q, x+1);           // 入队
    }
    return f;
}

int main(){
    int n = 5;
    int f = Fac(n);
    printf("The factorial of %d is %d.\n", n, f);
    return 0;
}

循环队列示例

下面是一个使用循环队列实现的简易银行大厅管理程序:

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

typedef struct circular_queue{
    int *data;
    int front;
    int rear;
    int size;
}CircularQueue;

void InitQueue(CircularQueue *q, int size){
    q->data = (int*)malloc(size * sizeof(int));
    q->front = q->rear = 0;
    q->size = size;
}

bool EnQueue(CircularQueue *q, int x){
    if((q->rear + 1) % q->size == q->front)   return false;
    q->data[q->rear] = x;
    q->rear = (q->rear + 1) % q->size;
    return true;
}

bool DeQueue(CircularQueue *q, int *x){
    if(q->front == q->rear)   return false;
    *x = q->data[q->front];
    q->front = (q->front + 1) % q->size;
    return true;
}

int main(){
    CircularQueue q;
    int size = 5;
    InitQueue(&q, size);                // 初始化队列
    EnQueue(&q, 1);                     
    EnQueue(&q, 2);
    EnQueue(&q, 3);
    int x;
    DeQueue(&q, &x);                    // 办理业务1
    printf("办理业务1的顾客号码:%d\n", x);
    EnQueue(&q, 4);
    EnQueue(&q, 5);
    DeQueue(&q, &x);                    // 办理业务2
    printf("办理业务2的顾客号码:%d\n", x);
    EnQueue(&q, 6);
    EnQueue(&q, 7);
    while(DeQueue(&q, &x)){             // 查看当前队列中的客户
        printf("%d ", x);
    }
    printf("\n");
    return 0;
}

以上两个示例分别为链式队列和循环队列的应用,可以看到这两种队列的实现方式、操作和应用场景的不同,需要根据实际情况选择合适的队列实现方式。

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

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 电脑硬盘里的program files文件夹是什么意思

    电脑硬盘里的“program files”文件夹指的是安装在Windows操作系统上的应用程序和软件的主要目录,一般安装程序将软件安装到该目录下,同时该目录也是Windows操作系统中的受保护文件夹。 一般情况下,Windows操作系统在C盘下会默认创建一个名为“Program Files”的文件夹,主要用于存放已安装的软件和应用程序。这个文件夹的主要作用是…

    other 2023年6月27日
    00
  • Android UI设计之AlertDialog弹窗控件

    Android UI设计之AlertDialog弹窗控件 在Android应用程序中,弹出式对话框是非常有用的。其中最常用的就是AlertDialog弹窗控件,因为它可以提示用户采取某项操作或提醒用户做什么。本文将介绍如何在Android应用程序中使用AlertDialog控件。 1. 显示AlertDialog 要显示AlertDialog控件,我们可以使…

    other 2023年6月26日
    00
  • Xmind8 Pro 最新激活序列号

    Xmind8 Pro 最新激活序列号攻略 1. 确认Xmind8 Pro版本 在进行激活序列号之前,首先需要确认当前安装的Xmind8 Pro版本。可以在软件界面的左上角找到“Xmind8”菜单,点击下拉菜单中的“关于Xmind8”,弹出的窗口中会显示当前版本信息。请确保下载的序列号与当前版本匹配。 示例说明:如果当前安装的Xmind8版本为3.7.6,则需…

    other 2023年6月27日
    00
  • NFS(网络文件系统)服务器简单解析

    NFS(网络文件系统)服务器简单解析 NFS即网络文件系统,是一种分布式文件系统,它允许在网络上通过服务器和客户端来分享文件。本文将介绍NFS服务器的简单配置,并提供两个示例说明。 1. 安装NFS服务器 在Linux系统中,安装NFS服务器和客户端通常非常简单。以Ubuntu为例,执行以下命令即可安装NFS服务器: sudo apt-get update …

    other 2023年6月27日
    00
  • 下载安装androidsdktools

    下载安装 Android SDK 工具 Android SDK 工具是开发 Android 应用程序所需的软件开发工具包(SDK)中的一个重要工具。下面将介绍如何下载和安装 Android SDK 工具。 下载 Android SDK 工具 打开 Android 开发者官网(https://developer.android.com/ )。 点击顶部导航栏中…

    其他 2023年3月28日
    00
  • KMP算法最浅显理解(小白教程)

    KMP算法最浅显理解(小白教程) 什么是KMP算法? KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,用于在一个主串中查找一个模式串的出现位置。与朴素的字符串匹配算法相比,KMP算法具有更高的效率。 KMP算法的基本思想 KMP算法的基本思想是利用已经匹配过的部分信息,避免不必要的回溯。它通过构建一个部分匹配表(Partial M…

    other 2023年8月6日
    00
  • js–获取滚动条位置 并实现页面滑动到锚点位置

    JS–获取滚动条位置并实现页面滑动到锚点位置 当我们进入一个网页,不免会发现有很多滚动条,当我们在页面上滑动时,滚动条的位置也会随着发生改变。在开发网页时,有时希望能够获取当前页面滚动条的位置,或者希望能够通过代码实现页面的滑动到特定位置。本篇文章将介绍如何使用JS获取滚动条位置,并通过JS实现页面滑动到锚点位置的功能。 获取滚动条位置 要获取滚动条位置,…

    其他 2023年3月28日
    00
  • RTX组建办公局域网服务器端安装设置

    RTX组建办公局域网服务器端安装设置攻略 RTX是一种被广泛应用于企业内部通信的软件,优点是可以建立私密的局域网通信环境,保证信息安全。在企业内部进行RTX服务器的搭建,可以方便组建企业级IM通讯系统。下面就为大家详细介绍一下如何搭建RTX私有IM通讯系统,具体如下: 第一步:准备软件资源 1.请先到要搭建的服务器上下载RTX服务端安装包,官方下载地址为ht…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部