表、栈和队列总结

抽象数据类型(abstract data type, ADT)是带有一组操作的一些对象的集合。对于集合ADT, 可以有像添加(add)、删除(remove)以及包含(contain)这样一些操作。

上面是权威解释,个人理解抽象数据类型就是有一堆数据的集合,我们可以对其进行增删改查等操作。

一、表

1.1 java中的表结构

在JAVA的list接口,里面又分为ArrayList和LinkedList两个大类,其特点如下:

ArrayList(数组实现):插入和 删除的花费存在潜在开销。最坏的情况下,在位置0的插入,首先需要将整个数组后移一个位置以空出空间来,而删除第一个元素则需要将表中的所有元素前移一个位置,因此这两种操作最坏的情况是O(N)。

优势: 查询高效(可以直接find数组的index)

缺陷:插入删除开销大(需要将全部数组移位)

LinkedList(链表实现):链表由一系列节点组成,这些节点不必在内存中相连。每一个节点均含有表元素和包含该元素后继元的节点的链(Link)。称其为next链。最后一单元的next链引用null。

删除 (remove)方法可以通过修改一个next引用来实现。插入(insert)方法需要使用new操作符从系统取得一个新节点,再修改next引用。

优势: 查询效率低(需要从头开始遍历)

缺陷:插入删除高效(不需要全盘移位)

1.2 for循环和迭代器Iterator对比

从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.(还是说明了一点遍历和集合本身分离了)

二、堆栈(stack)

栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,记作栈顶(top),又称作后进先出表(LIFO)。栈顶元素是整个模型中唯一可见的元素。

以上是栈的权威解释,个人理解堆栈是一个后进先出的数据结构,后进来的元素没有出去,先进来的元素是不可以出去的,所以堆栈是可以用于排序的。

在应用中,可以将中缀表达式转换成后缀表达式。

三、队列

队列也是表,使用时插入在一端进行而删除则在另一端进行,先进先出(FIFO)。

以上是队列的权威解释,个人理解队列是一个有方向的数据结构,对队列进行删除一定是删除表头元素,对队列进行插入一定是从队尾进行插入,所以我觉得这种数据结构,对于删除和插入效率应该很高,但查找的话就不方便了,得对整个队列进行遍历。

在计算机中,CPU的进程待处理的事物就是一个队列,一个一个任务就像排队一样等候CPU的处理

发布了30 篇原创文章 · 获赞 29 · 访问量 2221

猜你喜欢

转载自blog.csdn.net/weixin_41938314/article/details/103761702
今日推荐