追梦之旅【数据结构篇】——详解C语言实现顺序队列

简介: 前言🙌预备小知识🙌队列的概念及结构😊1.顺序队列头文件编写🙌2.Queue.c文件的编写🙌1)队列的初始化函数实现😊2)队列的销毁函数实现😊3)队尾入函数实现😊4)队头出函数实现😊5)取队首元素函数实现😊6)取队尾元素函数实现😊7)队列元素个数函数实现😊2)判空函数实现😊3.Test.c文件的编写:🙌总结撒花💞

微信图片_20230427214238.gif

😎博客昵称:博客小梦

😊最喜欢的座右铭:全神贯注的上吧!!!

😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主!

😘博主小留言:哈喽!😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不多说,文章推上!欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘


image.gif


前言🙌



   哈喽各位友友们😊,我今天又学到了很多有趣的知识,现在迫不及待的想和大家分享一下!😘我仅已此文,手把手带领大家详解C语言实现顺序队列~ 结合链表的相关算法,根据队列先进先出的结构特点,实现我们顺序队列。都是精华内容,可不要错过哟!!!😍😍😍


预备小知识🙌


队列的概念及结构😊


队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出

FIFO(First In First Out)


入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

队列的结构示意图:

微信图片_20230427220149.png


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;
}


功能测试结果展示图:

微信图片_20230427221004.png


总结撒花💞


   本篇文章旨在分享详解C语言实现顺序队列。希望大家通过阅读此文有所收获!😘如果我写的有什么不好之处,请在文章下方给出你宝贵的意见😊。如果觉得我写的好的话请点个赞赞和关注哦~😘😘😘

相关文章
|
3天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
3天前
|
存储 算法 C语言
【趣学C语言和数据结构100例】
《趣学C语言和数据结构100例》精选5个编程问题,涵盖求最大公约数与最小公倍数、字符统计、特殊序列求和及阶乘计算等,通过实例讲解C语言基础与算法思维,适合初学者实践学习。
|
11天前
初步认识栈和队列
初步认识栈和队列
35 10
|
11天前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
15 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
13天前
|
存储 安全 Java
【用Java学习数据结构系列】探索栈和队列的无尽秘密
【用Java学习数据结构系列】探索栈和队列的无尽秘密
25 2
|
13天前
|
存储 C语言
探索C语言数据结构:利用顺序表完成通讯录的实现
本文介绍了如何使用C语言中的顺序表数据结构实现一个简单的通讯录,包括初始化、添加、删除、查找和保存联系人信息的操作,以及自定义结构体用于存储联系人详细信息。
17 2
【数据结构】--- 栈和队列
【数据结构】--- 栈和队列
|
6天前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
9 0
|
11天前
探索数据结构:队列的的实现与应用
探索数据结构:队列的的实现与应用
|
11天前
|
存储 C语言
栈和队列题目练习
栈和队列题目练习
12 0