目录
一,什么是栈
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除数据操作的一端称为栈顶,另一端称为栈底。栈中的元素遵守后进先出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,测试的展示结果