栈和队列的数据结构,C语言实现

发布于:2023-01-22 ⋅ 阅读:(146) ⋅ 点赞:(0)

目录

一,什么是栈

二,栈的进出方式示意图

 三,栈的实现

 1,各种接口函数的声明介绍

 2,初始化和销毁栈

 3,入栈函数

 4,检测函数

 5,出栈函数

 6,获取栈顶元素函数

 7,获取栈中有效元素个数的函数

 8,展示的效果

四,什么是队列

 五,队列的实现

 1,结构体和函数的声明

 2,初始化和销毁函数

 3,入队列的函数

4,检测函数

 5,出队列的函数

 6,获取队头的数据以及取队尾的数据

 7,获取队列中有校元素个数 

 8,测试的展示结果


一,什么是栈

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除数据操作的一端称为栈顶,另一端称为栈底。栈中的元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:栈的删除数据操作叫做出栈。出数据也在栈底。

二,栈的进出方式示意图

进栈与出栈

 三,栈的实现

栈的实现既可以使用数组实现,也可以使用链表实现。但由于考虑到需要尾插数据,而数组尾插数据的代价比较小,所以综合考虑,选择数组实现更优。

 1,各种接口函数的声明介绍

实现方式依旧是依靠函数,并且声明和实现分开。

首先是考虑需要用到哪些操作函数,先一一列举出来,然后再一一实现即可。

先定义一个结构体,里面包含数组a,还有整型top是栈顶,capacity是容量。

然后用别名typedef,重新定义一下整型int 和结构体,方便后面的使用。

 2,初始化和销毁栈

初始化的函数和销毁的函数都比较简单,

第一步先断言一下,防止传递空指针过来,初始化然后如下图所示,即可。比较简单,一目了然。

销毁部分,由于是数组的空间是动态开辟出来的,用free释放。

3,入栈函数

先判断是否空间已满,看看需不需要开辟新的空间。而第一步是没有空间的,先给个4字节,之后只要满了就两倍的去开辟。

开辟成功之后,将数据x赋值给栈顶,然后++即可。

 4,检测函数

目的是检测栈是否为空,如果为空返回非零结果,如果不为空返回0。

用的bool类型,返回值只有true和false两种。

 5,出栈函数

先检测是否为空,如果上面检测函数,检测到top为空,则返回真,就是true,然后!取反,就是假,就是0,0=NULL。所以assert检测时,要加!,这样才能正确检测出来。

之后--top就行,就是出栈了。

 6,获取栈顶元素函数

依旧按照上面的,先检测是否栈顶为空,空了就没必要获取了。

然后直接返回值即可,STDataType是int的别名,前面定义过了。

 7,获取栈中有效元素个数的函数

也是非常简单,直接返回值top即可,top是栈顶,也可以理解为数组的大小。

 8,展示的效果

四,什么是队列

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

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

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

 五,队列的实现

1,队列也可以数组和链表的结果实现,使用链表的结构实现更优一点,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。

 1,结构体和函数的声明

实现方式和栈的方式一样,依旧是依靠函数,并且声明和实现分开。

实现队列要用,带头带尾的单链表。所以先定义一个结构体,再定义另一个包含头尾,用它实现

队尾插入,队头删除。

定义一个结构体,表示队列。包含一个结构体指针和数据,然后用别名typedef一下,

再定义一个结构体,表示结构体的头和尾,主要用的是,Queue这个结构体。

 2,初始化和销毁函数

初始化的函数和销毁的函数都比较简单,

第一步先断言一下,防止传递空指针过来,初始化然后如下图所示,即可。比较简单,一目了然。

销毁部分,先把头节点用指针变量储存起来,然后用循环,一直释放,最后把头和尾置空。

 3,入队列的函数

情况1:如果这个地方的head和tail第一次都是空,得先给你节点,

情况2:不为空的时候,直接在你后面直接去链接,

4,检测函数

目的是检测栈是否为空,如果为空返回非零结果,如果不为空返回0。

用的bool类型,返回值只有true和false两种,

 

 5,出队列的函数

先断言是否为空指针,

情况1:如果只剩最后一个节点的时候,我们单独拿出来处理。

情况2:其余正常情况,正常删除

 6,获取队头的数据以及取队尾的数据

非常简单的逻辑,看图即可

 7,获取队列中有校元素个数 

 用一个循环,遍历整个队列,用一个整型计数即可

 8,测试的展示结果

 

本文含有隐藏内容,请 开通VIP 后查看