本篇算是对集合类的总结。
常用的数据结构有:数组、链表、栈、队列、树、图。 这些数据结构都可以直接或间接地用 stl、util 中的集合类来表示:
数据结构 | 数组 | 链表 | 栈 | 队列 | 树 | 图 |
---|---|---|---|---|---|---|
C++ | vector | list | list | list | list | list |
java | ArrayList | LinkedList | LinkedList | LinkedList | LinkedList | LinkedList |
对于 数组、链表、栈、队列 的表示方式应该是没有争议的。树、图用链表来表示的场景如下:
- 多子树,一个结点有任意个孩子,所有孩子的指针(引用)存在一个链表中。
- 图,一个点有多个相邻的点,所有邻居的指针(引用)存在一个链表中,拓扑图(偏序图)一般这样表示。
用集合类来间接表示树、图的好处就是我们添加孩子/邻居更方便了(集合类实现了添加元素的操作),遍历所有孩子/邻居更方便了(通过迭代器或foreach遍历元素)。
特别地,java 中还隐藏着一棵平衡二叉树:
鉴于TreeMap 是基于红黑树的,所以我们可以新建一个类,其中添加一个 TreeMap 成员变量,然后利用 TreeMap 提供的各种操作实现 search、insert、delele,再注上"Made in XXX",一棵性能优良的平衡二叉树就诞生了!因此,二叉树这种常用的数据结构也不必再造了。
这些数据结构就像是编程中的鸡毛蒜皮, stl、util 已经把这些都处理好了,我们直接用就是了。有了这些强大的辅助,我们就可以直接应付程序中的业务逻辑了。