当前位置:主页 > c/c++教程 > C语言 队列

C语言数据结构不挂科指南之队列详解

发布:2023-03-02 20:30:01 59


给网友朋友们带来一篇相关的编程文章,网友寿倩美根据主题投稿了本篇教程内容,涉及到C语言、数据结构、队列、C语言、队列、C语言 队列相关内容,已被845网友关注,如果对知识点想更进一步了解可以在下方电子资料中获取。

C语言 队列

队列

这篇博客主要介绍一下队列的概念,并且采用 C 语言,编写两种存储实现方式:顺序存储链式存储,当然还有常规的队列基本操作的实现算法

队列基本概念

标准解释:队列(Queue)是有限个**同类型数据元素的线性序列,是一种先进先出**(First In First Out FIFO)的线性表,新键入的数据元素插在队列尾端,出队列的数据元素在队列首部被删除。

教材中给了一个示意图,不错

顺序队列结构类型中有三个域:data、front、rear。

data:一维数组,存储队列中的数据元素 font:指向队列首元素的前一个单元 rear:指向实际的队列尾元素单元

参考示意图

入队列操作可以用两条赋值语句

SQ.rear = SQ.rear+1;
SQ.data[SQ.rear] = x;

出队列操作可以用一条语句完成

SQ.front = SQ.front+1

但是,会出现一些问题,通过示意图说明一下

当然还有一种情况,一边入队列,一边出队列 注意下图,SQ.front 下面还有空间

所以为了解决这种假溢出问题,聪明的开发人员,想出来新的解决办法了,造一个环儿~

循环队列

下面看一个图,重点看一下 SQ.rear 与 SQ.front 的对应位置

如果上述图翻译成 C 语言代码,入队核心逻辑为

SQ.rear = (SQ.rear+1) % maxsize ;
SQ.data[SQ.rear] = x;

出队列的核心逻辑为

SQ.front = (SQ.front+1)%maxsize;

你在学习的时候,肯定对SQ.rear+1SQ.front+1有疑问

我们举例来说明一下吧

顺序队列的 C 语言实现

接下来难度指数上升,开始用 C 语言编写代码吧

一顿操作之后,还是比较简单的,总之不写链式存储,顺序的还是比较简单的

#include 
#include 

//循环队列最大数据元素个数
const int maxsize = 8;

//循环队列的结构体
typedef struct cycqueue{
    int *data;
    int front,rear;
} CycQue;


//队列初始化
void init(CycQue *CQ){
    CQ->data = (int *)malloc(maxsize*sizeof(int));
    CQ->front = 0;
    CQ->rear = 0;
}


//判断队列是否为空
int empty(CycQue *CQ){
    if(CQ->rear==CQ->front) return 1;
    else return 0;
}


//入队列
int EnQueue(CycQue *CQ,int x){
    if((CQ->rear+1)%maxsize==CQ->front){
        printf("队列满");
        return 0;
    }
    else{
        CQ->rear =(CQ->rear+1) % maxsize;
        CQ->data[CQ->rear] = x;
        return 1;
    }

}

//出队列
int OutQueue(CycQue *CQ){
    if(empty(CQ)){
        printf("队列为空");
        return 0;
    }
    else{
        CQ->front = (CQ->front+1) % maxsize;
        return 1;

    }

}

int main()
{
    CycQue CQ;
    init(&CQ);

    EnQueue(&CQ,2);
    EnQueue(&CQ,4);
    printf("%d",CQ.rear);
    OutQueue(&CQ);
    printf("%d",CQ.front);
    return 0;
}

链式队列的 C 语言实现

链式队列其实有之前的经验之后,写起来难度系数也不会太高,接下来我们编写一个核心的部分代码

队列的链接实现实际上是用一个带有头结点的单链表来表示队列,成为链队列 头指针指向链表的头结点 单链表的头结点的 next 域指向队列首结点 尾指针指向队列尾结点,即单链表的最后一个结点

初始化

#include 
#include 
typedef struct LinkQueueNode{
	int *data;
	struct LinkQueueNode *next;
} LkQueNode;

typedef struct LkQueue{
    LkQueNode *front,*rear;
} LkQue;


void init(LkQue *LQ){
    LkQueNode *temp;
    temp = (LkQueNode *)malloc(sizeof(LkQueNode)); //生成队列的头结点
    LQ->front = temp;    //队列头指针指向队列头结点
    LQ->rear = temp;     //队列尾指针指向队列尾结点
    (LQ->front)->next = NULL;

}

核心两个操作入队列和出队列

入队列代码如下

//入队列
void EnQueue(LkQue *LQ,int x){

    LkQueNode *temp;
    temp = (LkQueNode *)malloc(sizeof(LkQueNode));
    temp->data = x;
    temp-next = NULL;
    (LQ->rear)->next = temp;
    LQ->rear = temp;
}

出队列这个事情就交给你自己吧,好好理解一下,就可以写出来了

自考要点

在考试中,队列容易出现编码题目,占比在 7~10 分,所以还是蛮重要的呢!

到此这篇关于C语言数据结构不挂科指南之队列详解的文章就介绍到这了,更多相关C语言 队列内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!


参考资料

相关文章

  • c语言和python之间有什么区别

    c语言和python之间有什么区别

    发布:2022-06-22

    为网友们分享了关于python的教程,c语言和python之间的主要区别是:Python是一种面向对象的解释型语言,通过缩进来表示语句体,在Python中每一条语句结尾后没有分号;C是一种面向过程的编译型语言,通过{}来表示语句体,C语言


  • 一文带你搞懂C语言预处理宏定义

    发布:2023-03-04

    这篇文章主要为大家详细介绍了C语言预处理宏定义#define,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下


  • 深入c语言continue和break的区别详解

    发布:2023-02-28

    给大家整理了关于c语言的教程,本篇文章是对c语言中continue和break的区别进行了详细的分析介绍,需要的朋友参考下


  • C语言实现经典windows游戏扫雷的示例代码

    发布:2023-03-04

    今天我们会用C语言实现一个经典的windows小游戏:扫雷。扫雷是一款单机小游戏,每次通关最高难度的关卡都会开心好一阵。现在学会了C语言,总算可以自己实现扫雷了。话不多说,咱们开始吧


  • C语言将音视频时钟同步封装成通用模块的方法

    发布:2023-03-01

    视频的时钟基于视频帧的时间戳,由于视频是通过一定的帧率渲染的,采用直接读取当前时间戳的方式获取时钟会造成一定的误差,精度不足,这篇文章主要介绍了c语言将音视频时钟同步封装成通用模块,需要的朋友可以参考下


  • C语言文件操作总结

    发布:2022-04-06

    本篇文章给大家通过代码示例讲述了C语言文件操作的相关知识点,对此有兴趣的朋友可以参考学习下。


  • 详解C语言内核中的链表与结构体

    发布:2023-03-03

    Windows内核中是无法使用vector容器等数据结构的,当我们需要保存一个结构体数组时,就需要使用内核中提供的专用链表结构。本文分享了几个内核中使用链表存储多个结构体的通用案例,希望对你有所帮助


  • C语言:队列的实现全解析

    C语言:队列的实现全解析

    发布:2022-12-06

    给网友们整理关于C语言的教程,队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素


网友讨论