郑州网站建设方案优化,5g云网站建设,辽宁工程建设信息网诚信库怎么填,wordpress插件中心详解C语言实现顺序队列~#x1f60e;前言#x1f64c;预备小知识#x1f64c;队列的概念及结构#x1f60a;1.顺序队列头文件编写#x1f64c;2.Queue.c文件的编写#x1f64c;1#xff09;队列的初始化函数实现#x1f60a;2#xff09;队列的销毁函数实现#x1f6…
详解C语言实现顺序队列~前言预备小知识队列的概念及结构1.顺序队列头文件编写2.Queue.c文件的编写1队列的初始化函数实现2队列的销毁函数实现3队尾入函数实现4队头出函数实现5取队首元素函数实现6取队尾元素函数实现7队列元素个数函数实现2判空函数实现3.Test.c文件的编写总结撒花博客昵称博客小梦 最喜欢的座右铭全神贯注的上吧 作者简介一名热爱C/C算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主 博主小留言哈喽各位CSDN的uu们我是你的博客好友小梦希望我的文章可以给您带来一定的帮助话不多说文章推上欢迎大家在评论区唠嗑指正觉得好的话别忘了一键三连哦 前言 哈喽各位友友们我今天又学到了很多有趣的知识现在迫不及待的想和大家分享一下我仅已此文手把手带领大家详解C语言实现顺序队列~ 结合链表的相关算法根据队列先进先出的结构特点实现我们顺序队列。都是精华内容可不要错过哟 预备小知识
队列的概念及结构
队列只允许在一端进行插入数据操作在另一端进行删除数据操作的特殊线性表队列具有先进先出 FIFO(First In First Out)
入队列进行插入操作的一端称为队尾出队列进行删除操作的一端称为队头
队列的结构示意图
1.顺序队列头文件编写
头文件的编写的整体思路分析 这里是有关头文件的编写和各种功能函数的声明首先用typedef关键字给存储数据类型取别名这样做的好处是以后想要改变队列的数据类型只需修改typedef int DataType;里的int即可。定义一个结构体DataType aDataType Top队首元素下标DataType Last。DataType Capacity以及队列容量。然后是各个功能函数声明* #pragma once
#includestdio.h
#includestdlib.h
#includeassert.h
#includestdbool.htypedef 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;}
2判空函数实现
编写的整体思路分析 先用assert确保ps指针的有效性如果 ps-Top ps-Last为真则返回1队列为空。条件为假则返回0。 //判空
bool SqQueueEmpty(SQ* ps)
{assert(ps);return(ps-Top ps-Last);
}
3.Test.c文件的编写
#includeQueue.hvoid 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语言实现顺序队列。希望大家通过阅读此文有所收获如果我写的有什么不好之处请在文章下方给出你宝贵的意见。如果觉得我写的好的话请点个赞赞和关注哦~