😎博客昵称:博客小梦
😊最喜欢的座右铭:全神贯注的上吧!!!
😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!
😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘
前言🙌
哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言实现顺序队列~ 结合链表的相关算法,根据队列先进先出的结构特点,实现我们顺序队列。都是精华内容,可不要错过哟!!!😍😍😍
预备小知识🙌
队列的概念及结构😊
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
队列的结构示意图:
1.顺序队列头文件编写🙌
头文件的编写的整体思路分析:
这里是有关头文件的编写和各种功能函数的声明,首先用typedef关键字给存储数据类型取别名,这样做的好处是以后想要改变队列的数据类型只需修改typedef int DataType;里的int即可。定义一个结构体,DataType a,DataType Top队首元素下标,DataType Last。DataType Capacity以及队列容量。然后是各个功能函数声明*
#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<stdbool.h> typedef int DataType; typedef struct SqQueue { DataType* a; DataType Top; DataType Last; DataType Capacity; }SQ; //队列的初始化 void SqQueueInit(SQ* ps); //队列的销毁 void SqQueueDestory(SQ* ps); //队尾入 void SqQueuePush(SQ* ps, DataType x); //队头出 void SqQueuePop(SQ* ps); //取队首元素 DataType SqQueueFront(SQ* ps); //取队尾元素 DataType SqQueueBack(SQ* ps); //队列元素个数 DataType SqQueueSize(SQ* ps); //判空 bool SqQueueEmpty(SQ* ps);
2.Queue.c文件的编写🙌
1)队列的初始化函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,然后让指针a为NULL,让队列容量,头尾下标都为0.
//队列的初始化 void SqQueueInit(SQ* ps) { assert(ps); ps->a = NULL; ps->Capacity = 0; ps->Top = ps->Last = 0; }
2)队列的销毁函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,然后将a指向的空间返还给操作系统。然后将a置为NULL,防止野指针的问题。然后让 ps->Last = ps->Top = ps->Capacity = 0;
/队列的销毁 void SqQueueDestory(SQ* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->Last = ps->Top = ps->Capacity = 0; }
3)队尾入函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,如果ps->Last == ps->Capacity,则让节点个数增加,为0的时候先生成四个节点数,如果满了则是增2倍算法思想。然后用realloc动态申请空间,用if判断是否增容成功。然后将指针a指向新开辟的空间所在的地址,把容量数值改为newnode。如果一开始为空的情况,则让ps->a[ps->Top] = ps->a[ps->Last] = x
//队尾入 void SqQueuePush(SQ* ps, DataType x) { assert(ps); if (ps->Last == ps->Capacity) { DataType newnode = ps->Capacity == 0 ? 4 : ps->Capacity * 2; DataType* temp = (DataType*)realloc(ps->a,sizeof(DataType)*newnode); if (temp == NULL) { printf("realloc fail\n"); exit(-1); } ps->a = temp; ps->Capacity = newnode; } if (ps->Last == ps->Top) { ps->a[ps->Top] = ps->a[ps->Last] = x; ps->Last++; } else { ps->a[ps->Last] = x; ps->Last++; } }
4)队头出函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,调用判空函数,如果队列为空则不用执行此操作,执行则报错。直接让Top加1即可。
//队头出 void SqQueuePop(SQ *ps) { assert(ps); assert(!SqQueueEmpty(ps)); ps->Top++; }
5)取队首元素函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,直接返回下标为Top的元素的数值。
//取队首元素 DataType SqQueueFront(SQ* ps) { assert(ps); return ps->a[ps->Top]; }
6)取队尾元素函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,直接返回下标为Last-1的元素的数值。
//取队尾元素 DataType SqQueueBack(SQ* ps) { return ps->a[ps->Last-1]; }
7)队列元素个数函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,直接返回下标为Last的数值。
//队列元素个数 DataType SqQueueSize(SQ* ps) { assert(ps); return ps->Last; }
8)判空函数实现😊
编写的整体思路分析:
先用assert确保ps指针的有效性,如果 ps->Top ==ps->Last为真,则返回1,队列为空。条件为假,则返回0。
//判空 bool SqQueueEmpty(SQ* ps) { assert(ps); return(ps->Top ==ps->Last); }
3.Test.c文件的编写:🙌
#include"Queue.h" void Test1() { printf("队列输出:\n"); SQ s; SqQueueInit(&s); SqQueuePush(&s, 1); SqQueuePush(&s, 2); SqQueuePush(&s, 3); SqQueuePush(&s, 4); SqQueuePush(&s, 5); SqQueuePush(&s, 6); SqQueuePush(&s, 7); while (!SqQueueEmpty(&s)) { printf("%d", SqQueueFront(&s)); SqQueuePop(&s); } printf("\n"); SqQueueDestory(&s); } void Test2() { SQ s; SqQueueInit(&s); SqQueuePush(&s, 1); SqQueuePush(&s, 2); SqQueuePush(&s, 3); SqQueuePush(&s, 4); SqQueuePush(&s, 5); SqQueuePush(&s, 6); SqQueuePush(&s, 7); printf("队列首元素:%d\n", SqQueueFront(&s)); printf("队列尾元素:%d\n", SqQueueBack(&s)); printf("队列元素个数:%d\n", SqQueueSize(&s)); SqQueueDestory(&s); } int main() { Test1(); Test2(); return 0; }
功能测试结果展示图:
总结撒花💞
本篇文章旨在分享详解C语言实现顺序队列。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘