C语言数据结构(6)——队列

欢迎来到博主的专栏——C语言进阶指南
博主ID:代码小豪

文章目录

    • 队列
    • 顺序结构的队列
      • 顺序队列的初始化
      • 顺序队列的入队列操作
      • 判断队列是否为空
      • 顺序队列的出队列操作
      • 顺序队列操作的所有代码
    • 链式结构的队列
      • 链式队列的初始化
      • 链式队列的初始化
      • 链式队列的入队列操作
      • 链式队列的出队列的操作
    • 链式队列的所有代码

队列

队列也是一种特殊的线性表,与栈先进后出(First In Last Out)的特性不同,队列的特性是先进先出(Firsr In First Out),即在表尾插入数据,在表头删除数据。

向队列插入数据的操作叫做入队列在这里插入图片描述
向队列删除数据的操作叫做出队列

在这里插入图片描述

当数据出队列时,处于队头的元素被删除,队头的后继元素成为新的队头
当数据入队列时,将新数据插入队尾元素的后继元素,并将新数据成队尾

队列的物理存储结构可以分为两种:

一是顺序存储结构的队列,即以数组的形式实现的队列

二是链式存储结构的队列,即以链表的形式实现的队列

通常来说,链式存储结构的队列性能更好,适用性也更佳

顺序结构的队列

顺序结构的队列分为两种,一种是使用静态开辟的空间的队列,称为静态队列
静态队列的结构类型为:

#define MAXSIZE 10
typedef int QueueData;
typedef struct queue
{QueueData vals[MAXSIZE];int front;int rear;
};

静态队列的缺点很明显,那就是队列会出现满的情况,在这种情况下无法进行入队列的操作。

动态队列主要作用就是可以对队列进行扩容,当队列出现满队列的状况时,可以对队列进行操作。

动态队列的结构如下:

#define MAXSIZE 10
typedef int QueueData;
typedef struct queue
{QueueData* vals;int front;int rear;int capacity;
}queue;

顺序队列的初始化

将队列中的数据根据需要进行初始化。

void SeqQueueInit(queue* q1)
{q1->vals = NULL;q1->front = 0;q1->rear = 0;q1->capacity = 0;
}

顺序队列的入队列操作

将待入队的数据插入至队尾(rear)当中,并将队尾(rear)指向下一个待插入数据的空间位置

在这里插入图片描述

void SeqQueuePush(queue* q1, QueueData e)
{if (SeqQueueFull(q1))//判断队列是否满{//满则进行扩容int newcapacity = q1->capacity == 0 ? 4 : 2 * q1->capacity;QueueData* tmp = (QueueData*)realloc(q1->vals,sizeof(QueueData) * newcapacity);assert(tmp);q1->vals = tmp;q1->capacity = newcapacity;}q1->vals[q1->rear] = e;q1->rear++;
}

判断队列是否为空

队列为空的情况很简单,当rear和front相等的时候队列为空
在这里插入图片描述

bool SeqQueueEmpty(queue* q1)
{return q1->front == q1->rear;
}

顺序队列的出队列操作

当数据出队列后,front需要指向新的队头元素,完成这个要求的方法有两种。
(1)当队头元素出队列后,将front的指针指向下一个元素

在这里插入图片描述
这种方法会导致队列的部分空间被浪费掉。
(2)
将队列的队头的位置保持不变,将后面的所有元素向前移动一位
在这里插入图片描述
这种处理方法虽然没有浪费空间,但是可以发现删除数据的时间复杂度到了O(N),也是存在不小的缺点

void SeqQueuePop(queue* q1)//方法1
{if (SeqQueueEmpty(q1)){perror("Queue is empty\n");exit(1);}q1->front++;
}

顺序队列操作的所有代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>#define MAXSIZE 10
typedef int QueueData;
typedef struct queue
{QueueData* vals;int front;int rear;int capacity;
}queue;void SeqQueueInit(queue* q1);
void SeqQueueDestory(queue* q1);void SeqQueuePush(queue* q1,QueueData e);
void SeqQueuePop(queue* q1);QueueData SeqQueueFront(queue* q1);
bool SeqQueueEmpty(queue* q1);
bool SeqQueueFull(queue* q1);void SeqQueueInit(queue* q1)
{q1->vals = NULL;q1->front = 0;q1->rear = 0;q1->capacity = 0;
}
void SeqQueueDestory(queue* q1)
{free(q1->vals);
}void SeqQueuePush(queue* q1, QueueData e)
{if (SeqQueueFull(q1))//判断队列是否满{//满则进行扩容int newcapacity = q1->capacity == 0 ? 4 : 2 * q1->capacity;QueueData* tmp = (QueueData*)realloc(q1->vals,sizeof(QueueData) * newcapacity);assert(tmp);q1->vals = tmp;q1->capacity = newcapacity;}q1->vals[q1->rear] = e;q1->rear++;
}
void SeqQueuePop(queue* q1)
{if (SeqQueueEmpty(q1)){perror("Queue is empty\n");exit(1);}q1->front++;
}QueueData SeqQueueFront(queue* q1)
{if (SeqQueueEmpty(q1)){perror("Queue is empty\n");exit(1);}return q1->vals[q1->front];
}bool SeqQueueEmpty(queue* q1)
{return q1->front == q1->rear;
}
bool SeqQueueFull(queue* q1)
{return q1->rear == q1->capacity;
}

链式结构的队列

既然顺序队列有着空间存储要求大,删除的时间复杂度高的缺点,那么链式结构饿的队列能不能解决这些问题呢?

链式队列的初始化

我们创建一个队列节点的结构,再创建一个队列的整体结构,将队列元素储存在节点当中。

typedef int LQueueData;
typedef struct QueueNode
{LQueueData val;struct QueueNode* next;
}QueueNode;typedef struct ListQueue
{QueueNode* front;//指向队头QueueNode* rear;//指向队尾int size;//队列大小
}ListQueue;

链式队列的初始化

根据使用需求对队列中的元素进行初始化,当链式队列为空队列时,队头与队尾指针都应该置为NULL。

void ListQueueInit(ListQueue* lq)
{lq->front = NULL;lq->rear = NULL;lq->size = 0;
}

链式队列的入队列操作

用尾插法,在队尾结点插入一个新的节点。
在这里插入图片描述

void ListQueuePush(ListQueue* lq, LQueueData e)
{//生成新节点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));newnode->val = e;newnode->next = NULL;if (ListQueueEmpty(lq)){lq->front = newnode;lq->rear = newnode;lq->size++;return;}//尾插法lq->rear->next = newnode;lq->rear = newnode;lq->size++;}

链式队列的出队列的操作

将front指针指向的节点释放,并将front指针指向下一个节点的位置
在这里插入图片描述

void ListQueuePop(ListQueue* lq)
{if (ListQueueEmpty(lq)){perror("Queue is empty\n");exit(1);}QueueNode* del = lq->front;lq->front = lq->front->next;lq->size--;free(del);
}

链式队列的所有代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>typedef int LQueueData;
typedef struct QueueNode
{LQueueData val;struct QueueNode* next;
}QueueNode;typedef struct ListQueue
{QueueNode* front;//指向队头QueueNode* rear;//指向队尾int size;//队列大小
}ListQueue;void ListQueueInit(ListQueue* lq);
void ListQueueDestory(ListQueue* lq);void ListQueuePush(ListQueue* lq,LQueueData e);
void ListQueuePop(ListQueue* lq);bool ListQueueEmpty(ListQueue* lq);
LQueueData ListQueueFront(ListQueue* lq);int ListQueueSize(ListQueue* lq);void ListQueueInit(ListQueue* lq)
{lq->front = NULL;lq->rear = NULL;lq->size = 0;
}
void ListQueueDestory(ListQueue* lq)
{QueueNode* cur = lq->front;while (cur){QueueNode* del = cur;cur = cur->next;free(del);}
}void ListQueuePush(ListQueue* lq, LQueueData e)
{//生成新节点QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));newnode->val = e;newnode->next = NULL;if (ListQueueEmpty(lq)){lq->front = newnode;lq->rear = newnode;lq->size++;return;}//尾插法lq->rear->next = newnode;lq->rear = newnode;lq->size++;}
void ListQueuePop(ListQueue* lq)
{if (ListQueueEmpty(lq)){perror("Queue is empty\n");exit(1);}QueueNode* del = lq->front;lq->front = lq->front->next;lq->size--;free(del);
}bool ListQueueEmpty(ListQueue* lq)
{if (lq->front == NULL){lq->rear = NULL;return true;}return false;
}
LQueueData ListQueueFront(ListQueue* lq)
{if (ListQueueEmpty(lq)){perror("Queue is empty\n");exit(1);}return lq->front->val;
}int ListQueueSize(ListQueue* lq)
{return lq->size;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518860.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端将html导出pdf文件解决分页问题

这是借鉴了qq_251025116大佬的解决方案并优化升级完成的&#xff0c;原文链接 1.安装依赖 npm install jspdf html2canvas2.使用方法 import htmlToPdffrom ./index.jsconst suc () > {message.success(success);};//记得在需要打印的div上面添加 idlet dom document.que…

Unity类银河恶魔城学习记录8-4 P80 Blackhole ability state源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic…

广西普通高等教育专升本考试 大纲与说明(电子与信息大类)

&#xff08;2025 年版&#xff09;广西普通高等教育专升本考试&#xff08;以下简称专升本考试&#xff09; &#xff08;电子与信息大类&#xff09; 详细文件看资源绑定 贯彻党的教育方针&#xff0c;落实立德树人根本任务&#xff0c;是普通高校全 日制高职&#xff08;专…

IDEA 配置文件乱码,项目编码设置

见下图 其中第一二项控制全局以及工程的编码格式&#xff0c;下方的则是 properties 配置文件的格式&#xff0c;统一调整为 UTF-8 后不再乱码

CMA认证和CNAS认可哪个更权威?CMA、CNAS软件测试报告用途简析

一、CMA认证是什么?   CMA认证是指中国计量认证&#xff0c;省级以上的计量行政部门根据中国计量法的规定&#xff0c;对申请CMA测试资质的第三方检测机构进行评估&#xff0c;对检测水平和检测可靠性达到国家标准的实验室授予计量认证合格证书(CMA资质)。 二、CNAS认可是什…

2024.3.6每日一题

LeetCode 找出数组中的 K -or 值 题目链接&#xff1a;2917. 找出数组中的 K-or 值 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&…

Vue3之集成Highlight.js代码语法亮显示插件

Vue3之集成Highlight.js代码语法亮显示插件 文章目录 Vue3之集成Highlight.js代码语法亮显示插件1.Vue3中集成说明2. 安装highlight.js与highlightjs/vue-plugin3. Vue3集成与使用1. main.ts(或main.js)中导入highlight.js2. 各语言测试代码3. 高亮显示vue文件4. 显示效果 4. H…

Java+SpringBoot+Vue+MySQL:农业管理新篇章

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

Windows环境下搭建chatGLM-6B-int4量化版模型(图文详解-成果案例)

目录 一、ChatGLM-6B介绍 二、环境准备 1. 硬件环境 2. TDM-GCC安装 3.git安装 4.Anaconda安装 三、模型安装 1.下载ChatGLM-6b和环境准备 方式一&#xff1a;git命令 方式二&#xff1a;手动下载 2.下载预训练模型 方式一&#xff1a;在Hugging Face HUb下载&…

2024电商新手怎么入行?哪个平台适合自己?

我是电商珠珠 2024年了&#xff0c;电商行业的热度也不断高涨。过年期间&#xff0c;京东在春晚投放了华为大礼包&#xff1b;淘宝也紧跟春晚步伐上架明星同款穿搭&#xff1b;抖音和央视春晚达成合作&#xff0c;在平台内直播&#xff0c;还送相应的福袋&#xff0c;和春晚独…

判断连续数据同意特征的方法:插旗法

bool isMonotonic(int* nums, int numsSize) {int flag 2;for (int i 1; i < numsSize; i) {if (nums[i-1] > nums[i]) {if (flag 0)return false;flag 1;}else if (nums[i-1] < nums[i]) {if (flag 1)return false;flag 0;}}return true; }此代码较为简单&…

剑指offer--c++--n个骰子的点数

目录 题目&#xff1a; 题目分析&#xff1a; 最后编写代码&#xff1a; 输出结果 题目&#xff1a; 把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n&#xff0c;打印出s的所有可能的值出现的概率。 感谢大佬的帮助&#xff1a;https://www.cnblogs.c…