《algorithms》摘录评注之贰:栈和队列

本笔记基于ROBERT SEDGEWICK & KEVIN WAYNE开设的《Algorithms》课程,同时配有同名教材。
slides本身内容丰富详实,所以我会先甄选出重点的篇幅整理出来并做简单批注,后续会添上对应算法题的演示。

栈和队列是两种基本的数据结构类型,它们有不同的方式去对存储的数据进行操作。
具体操作有:插入(push)、移除(pop)、迭代(iterate)以及检查是否为空等。
两者的差别主要是数据的移动顺序:
栈:后进先出
队列:先进先出
image_1ansq3r2mvm31t82f19ko6o919.png-79kB
栈的链表实现:
image_1ansq7jqj999ep77nrh01ci51g.png-133.3kB
image_1ansq7rd7pftu4lc511471ss81t.png-146.3kB
栈的数组实现:
image_1ansq88td1328kmia6k16f11bv92n.png-66.9kB
正如我们在数组实现这里所看到的,我们定义的数组容量是有限的,那么就会存放的元素就会出现“上溢”(数组放不下,要满溢出来了)或“下溢”(数组已经空了,还进行操作)的情况,所以我们需要一种“伸缩自如”的机制来防止这种溢出情况的发生,称为“resizing-array”。
image_1ansq8mish7613g3c5c67q96g3h.png-90.6kB
image_1ansq900j1nhf17pi15oa1jgnhus3u.png-77.6kB
image_1ansq96po8bhpl71jnk1s3h9q4b.png-149.3kB
其具体实现方法:
“伸”:如果原来的数组已满,那么创建一个新数组,容量为原来的两倍,同时把原来数组的元素拷贝进新数组。
“缩”:如果数组中的元素减少为容量的四分之一时,把数组容量减少为原来的一半。

可伸缩的数组实现与链表实现对比:
image_1ansqalkspa51o8gtp91rfn1qn96c.png-93.9kB
队列的链表实现:
image_1ansqbcbg9ghdulhfv1n7d5c576.png-145.4kB
队列的数组实现:
image_1ansqbq231r2g1g0jgcr1hri1s8780.png-75.3kB
栈的应用实例,非常常见:比如浏览网页/打开文件夹后使用“后退”(回到最近的位置,后进先出)等等。
image_1ansqc82p5s918ap1tp4v2918ar8q.png-131.6kB

每篇文章除特殊声明外均以 CC BY-NC-SA 4.0 协议发布,非商业用途可以在保留署名和来源的情况下任意转载。