数据结构,小步前进之栈和队列

什么是栈?

在这里插入图片描述
就像生活中我们叠书一样,一本本的叠,当叠到一定高度的时候,我们需要取书时,往往从最上层取,

这就是 "后进先出"的数据结构,也成为栈。

栈是限定仅在表尾进行插入和删除操作的线性表。

我们将最顶层的称为栈顶(Top),最底层为栈底(bottom),不含元素称为空栈。

也可以很形象的称这种结构为后进先出(Last in First Out)LIFO结构。

栈一般有插入和删除操作,插入我们称为入栈,压栈,删除称为出栈,弹栈。

因为栈是线性表的特例,所以依据线性表的表现方式,栈亦有顺序存储结构和链表存储结构。

栈的顺序存储结构

一般使用数组作为存储数据的容器,然后定义Top指针指向顶层,标明第几索引为Top。

优点:

因为只允许栈顶进出,所以不存在移动位置问题,所以进出栈操作方便。

缺点:

因为使用数组,所以一开始就要定义栈的大小,不易扩展。

栈的链式存储结构

因为栈顶的top和链表的头结点重复,因此栈的链表不需要头结点

优点:

不需要提前分配好存储空间。

缺点:

因为增加指针域,所以增加了内存开销。

总结

如果使用过程元素变化不可预料,则使用链栈,在可控范围内,使用顺序栈。

递归

递归是栈的一个应用,诚如两面镜子对照。
在这里插入图片描述
在程序的应用中,一般是使用函数调用自身,即自己调用自己。

为了避免递归陷入循环,我们记得要至少一个条件跳出递归。

队列

什么是队列?

既然栈是后进先出,那有没有先进先出的,类似"排队"的逻辑结构?

没错,就是队列,类似于就是现实生活的排队。

队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。

允许插入的称为队尾,允许删除的为队头。

顺序存储结构的队列

如果使用顺序存储结构即数组实现队列,会有一个问题,每一次删除队头,后续的位置都要进行移动。

在这里插入图片描述
现实是如此,排队买票,前面买完往后撤,后面的人全部往前移动。

但是想想,为什么一定要如此呢? 如果不限制0一定为队头,那样不就可以避免多次移动?

所以也可以定义 font 指针和rear指针来指定头和尾的下一个位置。这样,当删除头的之后,头指针后移即可。

即:如果删除0,则头指针指向1即可。

在这里插入图片描述

这样是解决了多次移动的问题,但是,这样子···下面的情况,a1和a2空间不就被浪费了吗?
在这里插入图片描述

所以我们可以使用循环队列解决这个问题,即当队列“假满”的时候,将队尾移动到a1,即可重新插入。
在这里插入图片描述

队列的链式存储结构

其实就是单链表,不过只能尾进头出。

对您有帮助,请点赞,谢谢~

posted @ 2020-05-29 17:46  OneByOneDotNet  阅读(76)  评论(0编辑  收藏  举报