数据结构,小步前进之栈和队列
栈
什么是栈?
就像生活中我们叠书一样,一本本的叠,当叠到一定高度的时候,我们需要取书时,往往从最上层取,
这就是 "后进先出"的数据结构,也成为栈。
栈是限定仅在表尾进行插入和删除操作的线性表。
我们将最顶层的称为栈顶(Top),最底层为栈底(bottom),不含元素称为空栈。
也可以很形象的称这种结构为后进先出(Last in First Out)LIFO结构。
栈一般有插入和删除操作,插入我们称为入栈,压栈,删除称为出栈,弹栈。
因为栈是线性表的特例,所以依据线性表的表现方式,栈亦有顺序存储结构和链表存储结构。
栈的顺序存储结构
一般使用数组作为存储数据的容器,然后定义Top指针指向顶层,标明第几索引为Top。
优点:
因为只允许栈顶进出,所以不存在移动位置问题,所以进出栈操作方便。
缺点:
因为使用数组,所以一开始就要定义栈的大小,不易扩展。
栈的链式存储结构
因为栈顶的top和链表的头结点重复,因此栈的链表不需要头结点。
优点:
不需要提前分配好存储空间。
缺点:
因为增加指针域,所以增加了内存开销。
总结
如果使用过程元素变化不可预料,则使用链栈,在可控范围内,使用顺序栈。
递归
递归是栈的一个应用,诚如两面镜子对照。
在程序的应用中,一般是使用函数调用自身,即自己调用自己。
为了避免递归陷入循环,我们记得要至少一个条件跳出递归。
队列
什么是队列?
既然栈是后进先出,那有没有先进先出的,类似"排队"的逻辑结构?
没错,就是队列,类似于就是现实生活的排队。
队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。
允许插入的称为队尾,允许删除的为队头。
顺序存储结构的队列
如果使用顺序存储结构即数组实现队列,会有一个问题,每一次删除队头,后续的位置都要进行移动。
现实是如此,排队买票,前面买完往后撤,后面的人全部往前移动。
但是想想,为什么一定要如此呢? 如果不限制0一定为队头,那样不就可以避免多次移动?
所以也可以定义 font 指针和rear指针来指定头和尾的下一个位置。这样,当删除头的之后,头指针后移即可。
即:如果删除0,则头指针指向1即可。
这样是解决了多次移动的问题,但是,这样子···下面的情况,a1和a2空间不就被浪费了吗?
所以我们可以使用循环队列解决这个问题,即当队列“假满”的时候,将队尾移动到a1,即可重新插入。
队列的链式存储结构
其实就是单链表,不过只能尾进头出。
对您有帮助,请点赞,谢谢~